Merge 'Make sure explicit column aliases have binding precedence in orderby' from Pavan Nambi

closes https://github.com/tursodatabase/turso/issues/3684

Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com>

Closes #3709
This commit is contained in:
Pekka Enberg
2025-10-21 19:04:42 +03:00
committed by GitHub
2 changed files with 36 additions and 13 deletions

View File

@@ -3451,16 +3451,15 @@ pub fn bind_and_rewrite_expr<'a>(
if binding_behavior == BindingBehavior::TryResultColumnsFirst {
if let Some(result_columns) = result_columns {
for result_column in result_columns.iter() {
if result_column
.name(referenced_tables)
.is_some_and(|name| name.eq_ignore_ascii_case(&normalized_id))
{
if let Some(alias) = &result_column.alias {
if alias.eq_ignore_ascii_case(&normalized_id) {
*expr = result_column.expr.clone();
return Ok(WalkControl::Continue);
}
}
}
}
}
let mut match_result = None;
// First check joined tables
@@ -3553,16 +3552,15 @@ pub fn bind_and_rewrite_expr<'a>(
if binding_behavior == BindingBehavior::TryCanonicalColumnsFirst {
if let Some(result_columns) = result_columns {
for result_column in result_columns.iter() {
if result_column
.name(referenced_tables)
.is_some_and(|name| name.eq_ignore_ascii_case(&normalized_id))
{
if let Some(alias) = &result_column.alias {
if alias.eq_ignore_ascii_case(&normalized_id) {
*expr = result_column.expr.clone();
return Ok(WalkControl::Continue);
}
}
}
}
}
// SQLite behavior: Only double-quoted identifiers get fallback to string literals
// Single quotes are handled as literals earlier, unquoted identifiers must resolve to columns

View File

@@ -240,3 +240,28 @@ do_execsql_test_on_specific_db {:memory:} orderby_alias_precedence {
SELECT x AS y, y AS x FROM t ORDER BY x;
} {2|100
1|200}
# https://github.com/tursodatabase/turso/issues/3684
do_execsql_test_on_specific_db {:memory:} orderby_alias_shadows_column {
CREATE TABLE t(a, b);
INSERT INTO t VALUES (1, 1), (2, 2), (3, 3);
SELECT a, -b AS a FROM t ORDER BY a;
} {3|-3
2|-2
1|-1}
do_execsql_test_in_memory_any_error order_by_ambiguous_column {
CREATE TABLE a(id INT, value INT);
INSERT INTO a VALUES (1, 10), (2, 20);
CREATE TABLE b(id INT, value INT);
INSERT INTO b VALUES (1, 100), (2, 200);
SELECT
a.id,
b.value
FROM
a JOIN b ON a.id = b.id
ORDER BY
value;
}