diff --git a/core/translate/select.rs b/core/translate/select.rs index 7c024cb616..bea041d5cc 100644 --- a/core/translate/select.rs +++ b/core/translate/select.rs @@ -523,22 +523,24 @@ fn prepare_one_select_plan( }); } + let mut table_references = TableReferences::new(vec![], outer_query_refs.to_vec()); for value_row in values.iter_mut() { for value in value_row.iter_mut() { + // Before binding, we check for unquoted literals. Sqlite throws an error in this case bind_and_rewrite_expr( value, - None, + Some(&mut table_references), None, connection, // Allow sqlite quirk of inserting "double-quoted" literals (which our AST maps as identifiers) - BindingBehavior::AllowUnboundIdentifiers, + BindingBehavior::TryResultColumnsFirst, )?; } } let plan = SelectPlan { join_order: vec![], - table_references: TableReferences::new(vec![], vec![]), + table_references, result_columns, where_clause: vec![], group_by: None, diff --git a/core/translate/values.rs b/core/translate/values.rs index b537c24ae7..9111c9d965 100644 --- a/core/translate/values.rs +++ b/core/translate/values.rs @@ -63,7 +63,7 @@ fn emit_values_when_single_row( for (i, v) in first_row.iter().enumerate() { translate_expr_no_constant_opt( program, - None, + Some(&plan.table_references), v, start_reg + i, &t_ctx.resolver, diff --git a/testing/values.test b/testing/values.test index b0cc2464a7..ed4353c169 100755 --- a/testing/values.test +++ b/testing/values.test @@ -60,4 +60,21 @@ do_execsql_test_on_specific_db {:memory:} values-between { do_execsql_test_in_memory_any_error values-illegal-column-ref { CREATE TABLE t0 (c0); INSERT INTO t0 VALUES (c0); -} \ No newline at end of file +} + +# Unquoted identifiers in VALUES should produce a parse error +do_execsql_test_in_memory_any_error values-unquoted-identifier-single { + values(asdf); +} + +do_execsql_test_in_memory_any_error values-unquoted-identifier-mixed { + values(1, asdf); +} + +# Also verify correlated VALUES references outer columns row-by-row +do_execsql_test_on_specific_db {:memory:} values-correlated-values-in-select { + CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT); + INSERT INTO users (name) VALUES ('jack'), ('jill'); + SELECT id, (VALUES(name)) AS name_again FROM users; +} {1|jack +2|jill} \ No newline at end of file