Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions core/translate/select.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion core/translate/values.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
19 changes: 18 additions & 1 deletion testing/values.test
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

# 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}
Loading