Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

parser: support empty target list in SELECT #116835

Merged
merged 1 commit into from
Jan 5, 2024
Merged
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
2 changes: 1 addition & 1 deletion docs/generated/sql/bnf/simple_select_clause.bnf
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
simple_select_clause ::=
'SELECT' ( 'ALL' | ) ( ( target_elem ) ( ( ',' target_elem ) )* ) ( 'FROM' ( ( table_ref ) ( ( ',' table_ref ) )* ) ( ( 'AS' 'OF' 'SYSTEM' 'TIME' a_expr ) | ) | ) ( ( 'WHERE' a_expr ) | ) ( 'GROUP' 'BY' group_by_list | ) ( 'HAVING' a_expr | ) ( 'WINDOW' window_definition_list | )
'SELECT' ( 'ALL' | ) opt_target_list ( 'FROM' ( ( table_ref ) ( ( ',' table_ref ) )* ) ( ( 'AS' 'OF' 'SYSTEM' 'TIME' a_expr ) | ) | ) ( ( 'WHERE' a_expr ) | ) ( 'GROUP' 'BY' group_by_list | ) ( 'HAVING' a_expr | ) ( 'WINDOW' window_definition_list | )
| 'SELECT' ( 'DISTINCT' ) ( ( target_elem ) ( ( ',' target_elem ) )* ) ( 'FROM' ( ( table_ref ) ( ( ',' table_ref ) )* ) ( ( 'AS' 'OF' 'SYSTEM' 'TIME' a_expr ) | ) | ) ( ( 'WHERE' a_expr ) | ) ( 'GROUP' 'BY' group_by_list | ) ( 'HAVING' a_expr | ) ( 'WINDOW' window_definition_list | )
| 'SELECT' ( 'DISTINCT' 'ON' '(' ( ( a_expr ) ( ( ',' a_expr ) )* ) ')' ) ( ( target_elem ) ( ( ',' target_elem ) )* ) ( 'FROM' ( ( table_ref ) ( ( ',' table_ref ) )* ) ( ( 'AS' 'OF' 'SYSTEM' 'TIME' a_expr ) | ) | ) ( ( 'WHERE' a_expr ) | ) ( 'GROUP' 'BY' group_by_list | ) ( 'HAVING' a_expr | ) ( 'WINDOW' window_definition_list | )
6 changes: 5 additions & 1 deletion docs/generated/sql/bnf/stmt_block.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -2722,7 +2722,7 @@ scrub_option_list ::=
( scrub_option ) ( ( ',' scrub_option ) )*

simple_select_clause ::=
'SELECT' opt_all_clause target_list from_clause opt_where_clause group_clause having_clause window_clause
'SELECT' opt_all_clause opt_target_list from_clause opt_where_clause group_clause having_clause window_clause
| 'SELECT' distinct_clause target_list from_clause opt_where_clause group_clause having_clause window_clause
| 'SELECT' distinct_on_clause target_list from_clause opt_where_clause group_clause having_clause window_clause

Expand Down Expand Up @@ -3288,6 +3288,10 @@ opt_all_clause ::=
'ALL'
|

opt_target_list ::=
target_list
|

from_clause ::=
'FROM' from_list opt_as_of_clause
|
Expand Down
2 changes: 0 additions & 2 deletions pkg/cli/clisqlshell/sql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -335,14 +335,12 @@ func Example_includes() {
// SELECT -- incomplete statement, \i invalid
// \i testdata/i_twolevels2.sql
// ^
// HINT: try \h SELECT
// ERROR: at or near "\": syntax error
// SQLSTATE: 42601
// DETAIL: source SQL:
// SELECT -- incomplete statement, \i invalid
// \i testdata/i_twolevels2.sql
// ^
// HINT: try \h SELECT
// sql -f testdata/i_stopmiddle.sql
// ?column?
// 123
Expand Down
1 change: 0 additions & 1 deletion pkg/cli/interactive_tests/test_contextual_help.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ eexpect "use '??'"
eexpect " ->"
# restore the normal state
send ";\r"
eexpect HINT
eexpect root@
end_test

Expand Down
2 changes: 1 addition & 1 deletion pkg/sql/logictest/testdata/logic_test/select
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ two four
statement ok
CREATE TABLE abc (a INT PRIMARY KEY, b INT, c INT)

query error at or near "from": syntax error
statement ok
SELECT FROM abc

query error could not parse "hello" as type bool
Expand Down
1 change: 0 additions & 1 deletion pkg/sql/parser/help_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,6 @@ func TestContextualHelp(t *testing.T) {
{`SELECT * FROM ??`, `<SOURCE>`},
{`SELECT 1 AS OF ??`, `SELECT`},
{`SELECT 1 FROM foo ??`, `SELECT`},
{`SELECT 1 FROM foo WHERE ??`, `SELECT`},
{`SELECT 1 FROM (SELECT ??`, `SELECT`},
{`SELECT 1 FROM (VALUES ??`, `VALUES`},
{`SELECT 1 FROM (TABLE ??`, `TABLE`},
Expand Down
15 changes: 12 additions & 3 deletions pkg/sql/parser/sql.y
Original file line number Diff line number Diff line change
Expand Up @@ -1478,7 +1478,7 @@ func (u *sqlSymUnion) showFingerprintOptions() *tree.ShowFingerprintOptions {
%type <*tree.Tuple> expr_tuple1_ambiguous expr_tuple_unambiguous
%type <tree.NameList> attrs
%type <[]string> session_var_parts
%type <tree.SelectExprs> target_list
%type <tree.SelectExprs> opt_target_list target_list
%type <tree.UpdateExprs> set_clause_list
%type <*tree.UpdateExpr> set_clause multiple_set_clause
%type <tree.ArraySubscripts> array_subscripts
Expand Down Expand Up @@ -12770,7 +12770,7 @@ simple_select:
// [ OFFSET <expr> [ ROW | ROWS ] ]
// %SeeAlso: WEBDOCS/select-clause.html
simple_select_clause:
SELECT opt_all_clause target_list
SELECT opt_all_clause opt_target_list
from_clause opt_where_clause
group_clause having_clause window_clause
{
Expand Down Expand Up @@ -12812,7 +12812,6 @@ simple_select_clause:
Window: $8.window(),
}
}
| SELECT error // SHOW HELP: SELECT

set_operation:
select_clause UNION all_or_distinct select_clause
Expand Down Expand Up @@ -16266,6 +16265,16 @@ target_list:
$$.val = append($1.selExprs(), $3.selExpr())
}

opt_target_list:
target_list
{
$$.val = $1.selExprs()
}
| /* EMPTY */
{
$$.val = tree.SelectExprs{}
}

target_elem:
a_expr AS target_name
{
Expand Down
1 change: 0 additions & 1 deletion pkg/sql/parser/testdata/predefined_functions
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,6 @@ at or near ",": syntax error
DETAIL: source SQL:
SELECT POSITION('high', 'a')
^
HINT: try \h SELECT

parse
SELECT OVERLAY('w33333rce' PLACING 'resou' FROM 3)
Expand Down
1 change: 0 additions & 1 deletion pkg/sql/parser/testdata/select_clauses
Original file line number Diff line number Diff line change
Expand Up @@ -1488,7 +1488,6 @@ at or near "EOF": syntax error
DETAIL: source SQL:
SELECT * FROM t WHERE k=
^
HINT: try \h SELECT

parse
SELECT a FROM t ORDER BY a
Expand Down
42 changes: 27 additions & 15 deletions pkg/sql/parser/testdata/select_exprs
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
parse
SELECT
----
SELECT -- normalized!
SELECT -- fully parenthesized
SELECT -- literals removed
SELECT -- identifiers removed

parse
SELECT 1 + 1
----
Expand Down Expand Up @@ -77,7 +85,6 @@ lexical error: invalid floating point literal
DETAIL: source SQL:
SELECT 1e-\n-1
^
HINT: try \h SELECT

parse
SELECT *,-/* comment */-5
Expand Down Expand Up @@ -651,7 +658,6 @@ at or near "5": syntax error
DETAIL: source SQL:
SELECT 1 ||/ 5
^
HINT: try \h SELECT


parse
Expand Down Expand Up @@ -1390,7 +1396,6 @@ lexical error: invalid hexadecimal numeric literal
DETAIL: source SQL:
SELECT 0x FROM t
^
HINT: try \h SELECT

error
SELECT x'fail' FROM t
Expand All @@ -1399,7 +1404,6 @@ lexical error: invalid hexadecimal bytes literal
DETAIL: source SQL:
SELECT x'fail' FROM t
^
HINT: try \h SELECT

error
SELECT x'AAB' FROM t
Expand All @@ -1408,7 +1412,6 @@ lexical error: invalid hexadecimal bytes literal
DETAIL: source SQL:
SELECT x'AAB' FROM t
^
HINT: try \h SELECT

parse
SELECT CAST(1 AS STRING)
Expand Down Expand Up @@ -1848,7 +1851,6 @@ lexical error: unterminated string
DETAIL: source SQL:
SELECT '1
^
HINT: try \h SELECT

error
SELECT family FROM test
Expand All @@ -1857,16 +1859,30 @@ at or near "from": syntax error
DETAIL: source SQL:
SELECT family FROM test
^
HINT: try \h SELECT

error
parse
SELECT FROM t
----
SELECT FROM t -- normalized!
SELECT FROM t -- fully parenthesized
SELECT FROM t -- literals removed
SELECT FROM _ -- identifiers removed

parse
SELECT ALL FROM t
----
SELECT FROM t -- normalized!
SELECT FROM t -- fully parenthesized
SELECT FROM t -- literals removed
SELECT FROM _ -- identifiers removed

error
SELECT DISTINCT FROM test
----
at or near "from": syntax error
DETAIL: source SQL:
SELECT FROM t
^
HINT: try \h SELECT
SELECT DISTINCT FROM test
^

error
SELECT $0
Expand All @@ -1875,7 +1891,6 @@ lexical error: placeholder index must be between 1 and 65536
DETAIL: source SQL:
SELECT $0
^
HINT: try \h SELECT

error
SELECT $-1
Expand All @@ -1884,7 +1899,6 @@ at or near "$": syntax error
DETAIL: source SQL:
SELECT $-1
^
HINT: try \h SELECT

error
SELECT $123456789
Expand All @@ -1893,7 +1907,6 @@ lexical error: placeholder index must be between 1 and 65536
DETAIL: source SQL:
SELECT $123456789
^
HINT: try \h SELECT

error
SELECT (0) FROM y[array[]]
Expand Down Expand Up @@ -2021,7 +2034,6 @@ DATE '2000-03-03')
OVERLAPS
(DATE '2000-01-03')
^
HINT: try \h SELECT

parse
SELECT NOT ('a' ~ ANY (ARRAY['x']:::STRING[]))
Expand Down