diff --git a/core/translate/plan.rs b/core/translate/plan.rs index 26b495c30..ec556f3f9 100644 --- a/core/translate/plan.rs +++ b/core/translate/plan.rs @@ -4,6 +4,7 @@ use turso_parser::ast::{self, FrameBound, FrameClause, FrameExclude, FrameMode, use crate::{ function::AggFunc, schema::{BTreeTable, Column, FromClauseSubquery, Index, Schema, Table}, + translate::collate::get_collseq_from_expr, vdbe::{ builder::{CursorKey, CursorType, ProgramBuilder}, insn::{IdxInsertFlags, Insn}, @@ -840,8 +841,8 @@ impl JoinedTable { plan: SelectPlan, join_info: Option, internal_id: TableInternalId, - ) -> Self { - let columns = plan + ) -> Result { + let mut columns = plan .result_columns .iter() .map(|rc| Column { @@ -853,10 +854,15 @@ impl JoinedTable { notnull: false, default: None, unique: false, - collation: None, // FIXME: infer collation from subquery + collation: None, hidden: false, }) - .collect(); + .collect::>(); + + for (i, column) in columns.iter_mut().enumerate() { + column.collation = + get_collseq_from_expr(&plan.result_columns[i].expr, &plan.table_references)?; + } let table = Table::FromClauseSubquery(FromClauseSubquery { name: identifier.clone(), @@ -864,7 +870,7 @@ impl JoinedTable { columns, result_columns_start_reg: None, }); - Self { + Ok(Self { op: Operation::default_scan_for(&table), table, identifier, @@ -872,7 +878,7 @@ impl JoinedTable { join_info, col_used_mask: ColumnUsedMask::default(), database_id: 0, - } + }) } pub fn columns(&self) -> &[Column] { diff --git a/core/translate/planner.rs b/core/translate/planner.rs index 6e50b0a6f..38ee2c263 100644 --- a/core/translate/planner.rs +++ b/core/translate/planner.rs @@ -315,7 +315,7 @@ fn parse_from_clause_table( subplan, None, program.table_reference_counter.next(), - )); + )?); Ok(()) } ast::SelectTable::TableCall(qualified_name, args, maybe_alias) => parse_table( @@ -662,7 +662,7 @@ pub fn parse_from( cte_plan, None, program.table_reference_counter.next(), - )); + )?); } }