Skip to content

Commit 5c8d56e

Browse files
committed
feat: fixing name resolution for identifiers inside VALUES()
1 parent 47e0eff commit 5c8d56e

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

core/translate/select.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -523,22 +523,24 @@ fn prepare_one_select_plan(
523523
});
524524
}
525525

526+
let mut table_references = TableReferences::new(vec![], outer_query_refs.to_vec());
526527
for value_row in values.iter_mut() {
527528
for value in value_row.iter_mut() {
529+
// Before binding, we check for unquoted literals. Sqlite throws an error in this case
528530
bind_and_rewrite_expr(
529531
value,
530-
None,
532+
Some(&mut table_references),
531533
None,
532534
connection,
533535
// Allow sqlite quirk of inserting "double-quoted" literals (which our AST maps as identifiers)
534-
BindingBehavior::AllowUnboundIdentifiers,
536+
BindingBehavior::TryResultColumnsFirst,
535537
)?;
536538
}
537539
}
538540

539541
let plan = SelectPlan {
540542
join_order: vec![],
541-
table_references: TableReferences::new(vec![], vec![]),
543+
table_references,
542544
result_columns,
543545
where_clause: vec![],
544546
group_by: None,

core/translate/values.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ fn emit_values_when_single_row(
6363
for (i, v) in first_row.iter().enumerate() {
6464
translate_expr_no_constant_opt(
6565
program,
66-
None,
66+
Some(&plan.table_references),
6767
v,
6868
start_reg + i,
6969
&t_ctx.resolver,

testing/values.test

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,21 @@ do_execsql_test_on_specific_db {:memory:} values-between {
6060
do_execsql_test_in_memory_any_error values-illegal-column-ref {
6161
CREATE TABLE t0 (c0);
6262
INSERT INTO t0 VALUES (c0);
63-
}
63+
}
64+
65+
# Unquoted identifiers in VALUES should produce a parse error
66+
do_execsql_test_in_memory_error_content values-unquoted-identifier-single {
67+
values(asdf);
68+
} {Parse error: no such column: asdf}
69+
70+
do_execsql_test_in_memory_error_content values-unquoted-identifier-mixed {
71+
values(1, asdf);
72+
} {Parse error: no such column: asdf}
73+
74+
# Also verify correlated VALUES references outer columns row-by-row
75+
do_execsql_test_on_specific_db {:memory:} values-correlated-values-in-select {
76+
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);
77+
INSERT INTO users (name) VALUES ('jack'), ('jill');
78+
SELECT id, (VALUES(name)) AS name_again FROM users;
79+
} {1|jack
80+
2|jill}

0 commit comments

Comments
 (0)