From c4e3cce8a2cc3dcd8327759b405c610f8a3c11df Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Wed, 3 Jul 2024 21:54:25 +0300 Subject: [PATCH] Introduce Select struct This introduces an intermediate `Select` struct, which hopefully makes the codegen a bit simpler by transforming the complext AST to something more straight-forward. --- core/translate.rs | 106 +++++++++++++++++++++++++++++----------------- 1 file changed, 68 insertions(+), 38 deletions(-) diff --git a/core/translate.rs b/core/translate.rs index 07c8ff0b9..398dfeba5 100644 --- a/core/translate.rs +++ b/core/translate.rs @@ -2,13 +2,20 @@ use std::cell::RefCell; use std::rc::Rc; use crate::pager::Pager; -use crate::schema::Schema; +use crate::schema::{Schema, Table}; use crate::sqlite3_ondisk::{DatabaseHeader, MIN_PAGE_CACHE_SIZE}; use crate::util::normalize_ident; use crate::vdbe::{AggFunc, Insn, Program, ProgramBuilder}; use anyhow::Result; use sqlite3_parser::ast; +struct Select<'a> { + columns: Vec, + column_info: Vec, + from: Option<&'a Table>, + limit: Option, +} + enum AggregationFunc { Avg, Count, @@ -48,14 +55,61 @@ pub fn translate( pager: Rc, ) -> Result { match stmt { - ast::Stmt::Select(select) => translate_select(schema, select), + ast::Stmt::Select(select) => { + let select = build_select(schema, select)?; + translate_select(schema, select) + } ast::Stmt::Pragma(name, body) => translate_pragma(&name, body, database_header, pager), _ => todo!(), } } +fn build_select(schema: &Schema, select: ast::Select) -> Result