---
source: crates/squawk_parser/tests/tests.rs
input_file: crates/squawk_parser/tests/data/err/select.sql
---
SOURCE_FILE
COMMENT "--- via https://duckdb.org/docs/stable/sql/dialect/friendly_sql.html#trailing-commas"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE "\n "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "42"
WHITESPACE " "
AS_NAME
AS_KW "as"
WHITESPACE " "
COLUMN_NAME
IDENT "x"
COMMA ","
WHITESPACE "\n "
TARGET
ARRAY_EXPR
ARRAY_KW "array"
L_BRACK "["
LITERAL
STRING "'a'"
COMMA ","
WHITESPACE " "
LITERAL
STRING "'b'"
COMMA ","
WHITESPACE " "
LITERAL
STRING "'c'"
ERROR
COMMA ","
R_BRACK "]"
WHITESPACE " "
AS_NAME
AS_KW "as"
WHITESPACE " "
COLUMN_NAME
IDENT "y"
COMMA ","
WHITESPACE "\n "
TARGET
LITERAL
STRING "'hello world'"
WHITESPACE " "
AS_NAME
AS_KW "as"
WHITESPACE " "
COLUMN_NAME
IDENT "z"
ERROR
COMMA ","
WHITESPACE "\n"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- trailing comma in column list"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
WHITESPACE " "
FROM_ALIAS
AS_KW "as"
WHITESPACE " "
TABLE_ALIAS
IDENT "u"
COLUMN_LIST
L_PAREN "("
COLUMN_NAME
IDENT "a"
ERROR
COMMA ","
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- missing comma"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
NAME_REF
IDENT "a"
COMMA ","
WHITESPACE " "
TARGET
NAME_REF
IDENT "b"
WHITESPACE " "
AS_NAME
COLUMN_NAME
IDENT "c"
WHITESPACE " "
TARGET
NAME_REF
IDENT "d"
COMMA ","
WHITESPACE " "
TARGET
NAME_REF
IDENT "e"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
SEMICOLON ";"
WHITESPACE "\n"
COMMENT "-- ^ ^ comma missing"
WHITESPACE "\n"
COMMENT "-- \\-- this is a label"
WHITESPACE "\n\n"
COMMENT "-- distinct on missing a comma"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "SELECT"
WHITESPACE " "
DISTINCT_CLAUSE
DISTINCT_KW "DISTINCT"
WHITESPACE " "
DISTINCT_ON
ON_KW "ON"
WHITESPACE " "
L_PAREN "("
NAME_REF
IDENT "a"
WHITESPACE " "
NAME_REF
IDENT "b"
R_PAREN ")"
WHITESPACE " "
TARGET_LIST
TARGET
NAME_REF
IDENT "a"
COMMA ","
WHITESPACE " "
TARGET
NAME_REF
IDENT "b"
COMMA ","
WHITESPACE " "
TARGET
NAME_REF
IDENT "c"
WHITESPACE "\n "
FROM_CLAUSE
FROM_KW "FROM"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
WHITESPACE "\n "
ORDER_BY_CLAUSE
ORDER_KW "order"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
SORT_BY_LIST
SORT_BY
NAME_REF
IDENT "a"
COMMA ","
WHITESPACE " "
SORT_BY
NAME_REF
IDENT "b"
WHITESPACE " "
SORT_DESC
DESC_KW "desc"
SEMICOLON ";"
WHITESPACE " \n\n"
COMMENT "-- group bys with missing commas"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
WHITESPACE " "
GROUP_BY_CLAUSE
GROUP_KW "group"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
GROUP_BY_LIST
GROUPING_ROLLUP
ROLLUP_KW "rollup"
WHITESPACE " "
L_PAREN "("
LITERAL
INT_NUMBER "1"
WHITESPACE " "
LITERAL
INT_NUMBER "2"
WHITESPACE " "
LITERAL
INT_NUMBER "3"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
WHITESPACE " "
GROUP_BY_CLAUSE
GROUP_KW "group"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
GROUP_BY_LIST
GROUPING_CUBE
CUBE_KW "cube"
WHITESPACE " "
L_PAREN "("
LITERAL
INT_NUMBER "1"
WHITESPACE " "
LITERAL
INT_NUMBER "2"
WHITESPACE " "
LITERAL
INT_NUMBER "3"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "u"
WHITESPACE "\n "
GROUP_BY_CLAUSE
GROUP_KW "group"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
GROUP_BY_LIST
GROUPING_SETS
GROUPING_KW "grouping"
WHITESPACE " "
SETS_KW "sets"
L_PAREN "("
GROUPING_EXPR
TUPLE_EXPR
L_PAREN "("
LITERAL
INT_NUMBER "1"
WHITESPACE " "
LITERAL
INT_NUMBER "2"
R_PAREN ")"
WHITESPACE " "
GROUPING_SETS
GROUPING_KW "grouping"
WHITESPACE " "
SETS_KW "sets"
L_PAREN "("
GROUPING_EXPR
TUPLE_EXPR
L_PAREN "("
R_PAREN ")"
COMMA ","
WHITESPACE " "
GROUPING_SETS
GROUPING_KW "grouping"
WHITESPACE " "
SETS_KW "sets"
L_PAREN "("
GROUPING_EXPR
TUPLE_EXPR
L_PAREN "("
R_PAREN ")"
R_PAREN ")"
R_PAREN ")"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- trailing comma in args"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
NAME_REF
IDENT "f"
ARG_LIST
L_PAREN "("
ARG
LITERAL
INT_NUMBER "1"
ERROR
COMMA ","
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- missing args"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
NAME_REF
IDENT "f"
ARG_LIST
L_PAREN "("
ARG
NAME_REF
IDENT "a"
COMMA ","
ERROR
COMMA ","
ERROR
COMMA ","
ERROR
COMMA ","
ERROR
COMMA ","
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- in can only be used with tuples / sub queries"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
BIN_EXPR
LITERAL
INT_NUMBER "1"
WHITESPACE " "
IN_KW "in"
WHITESPACE " "
NAME_REF
IDENT "c"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- type cast must use a string literal"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
NAME_REF
NUMERIC_KW "numeric"
WHITESPACE " "
TARGET
LITERAL
INT_NUMBER "1234"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- missing comma"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
ARRAY_EXPR
ARRAY_KW "array"
L_BRACK "["
LITERAL
INT_NUMBER "1"
WHITESPACE " "
LITERAL
INT_NUMBER "2"
COMMA ","
LITERAL
INT_NUMBER "3"
R_BRACK "]"
SEMICOLON ";"
WHITESPACE "\n"
COMMENT "-- extra comma"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
ARRAY_EXPR
ARRAY_KW "array"
L_BRACK "["
LITERAL
INT_NUMBER "1"
COMMA ","
WHITESPACE " "
ERROR
COMMA ","
LITERAL
INT_NUMBER "3"
R_BRACK "]"
SEMICOLON ";"
WHITESPACE "\n"
COMMENT "-- trailing comma"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
ARRAY_EXPR
ARRAY_KW "array"
L_BRACK "["
LITERAL
INT_NUMBER "1"
COMMA ","
LITERAL
INT_NUMBER "2"
COMMA ","
LITERAL
INT_NUMBER "3"
ERROR
COMMA ","
R_BRACK "]"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- group by all, order by all"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
WHITESPACE " "
GROUP_BY_CLAUSE
GROUP_KW "group"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
ALL
ALL_KW "all"
WHITESPACE " "
ORDER_BY_CLAUSE
ORDER_KW "order"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
SORT_BY_LIST
SORT_BY
ERROR
ALL_KW "all"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- cast with malformed type mod args"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CAST_EXPR
CAST_KW "cast"
L_PAREN "("
NAME_REF
IDENT "x"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
VARCHAR_TYPE
VARCHAR_KW "varchar"
ARG_LIST
L_PAREN "("
ARG
LITERAL
INT_NUMBER "100"
WHITESPACE " "
ARG
LITERAL
INT_NUMBER "200"
R_PAREN ")"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CAST_EXPR
CAST_KW "cast"
L_PAREN "("
NAME_REF
IDENT "x"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
VARCHAR_TYPE
VARCHAR_KW "varchar"
ARG_LIST
L_PAREN "("
ARG
LITERAL
INT_NUMBER "100"
COMMA ","
WHITESPACE " "
ERROR
COMMA ","
WHITESPACE " "
ARG
LITERAL
INT_NUMBER "200"
R_PAREN ")"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CAST_EXPR
CAST_KW "cast"
L_PAREN "("
NAME_REF
IDENT "x"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
ARG_LIST
L_PAREN "("
ARG
NAME_REF
IDENT "a"
COMMA ","
WHITESPACE " "
ARG
NAME_REF
IDENT "b"
ERROR
COMMA ","
R_PAREN ")"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- regression test: this would cause the parser to get stuck & panic, now it"
WHITESPACE "\n"
COMMENT "-- warns about a missing semicolon"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
SELECT
SELECT_CLAUSE
SELECT_KW "select"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- extra comma"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
NAME_REF
IDENT "a"
ERROR
COMMA ","
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- case missing then expr"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CASE_EXPR
CASE_KW "case"
WHITESPACE " "
WHEN_CLAUSE_LIST
WHEN_CLAUSE
WHEN_KW "when"
WHITESPACE " "
LITERAL
INT_NUMBER "1"
WHITESPACE " "
THEN_KW "then"
WHITESPACE " "
END_KW "end"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- case missing when expr"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CASE_EXPR
CASE_KW "case"
WHITESPACE " "
WHEN_CLAUSE_LIST
WHEN_CLAUSE
WHEN_KW "when"
WHITESPACE " "
THEN_KW "then"
WHITESPACE " "
NAME_REF
IDENT "x"
WHITESPACE " "
END_KW "end"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- case missing else expr"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CASE_EXPR
CASE_KW "case"
WHITESPACE " "
WHEN_CLAUSE_LIST
WHEN_CLAUSE
WHEN_KW "when"
WHITESPACE " "
LITERAL
INT_NUMBER "1"
WHITESPACE " "
THEN_KW "then"
WHITESPACE " "
LITERAL
INT_NUMBER "2"
WHITESPACE " "
ELSE_CLAUSE
ELSE_KW "else"
WHITESPACE " "
END_KW "end"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- select without semi and trailing create table"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE "\n"
CREATE_TABLE
CREATE_KW "create"
WHITESPACE " "
TABLE_KW "table"
WHITESPACE " "
TABLE_NAME
PATH
PATH_SEGMENT
IDENT "users"
WHITESPACE " "
TABLE_ARG_LIST
L_PAREN "("
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n\n"
COMMENT "-- select do"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " \n"
DO
DO_KW "do"
WHITESPACE " "
LITERAL
STRING "'begin null; end'"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- select grant"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " \n"
GRANT
GRANT_KW "grant"
WHITESPACE " "
REVOKE_COMMAND_LIST
REVOKE_COMMAND
SELECT_KW "select"
WHITESPACE " "
ON_PRIVILEGE_OBJECTS_CLAUSE
ON_KW "on"
WHITESPACE " "
PRIVILEGE_DEFAULT
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
WHITESPACE " "
TO_KW "to"
WHITESPACE " "
ROLE_REF_LIST
ROLE_REF
ROLE_NAME_REF
IDENT "u"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- where with missing expr"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
WHITESPACE " "
WHERE_CLAUSE
WHERE_KW "where"
WHITESPACE " "
ERROR
AND_KW "and"
WHITESPACE " "
BIN_EXPR
NAME_REF
IDENT "c"
WHITESPACE " "
R_ANGLE ">"
WHITESPACE " "
LITERAL
INT_NUMBER "10"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
WHITESPACE " "
WHERE_CLAUSE
WHERE_KW "where"
WHITESPACE " "
ERROR
OR_KW "or"
WHITESPACE " "
BIN_EXPR
NAME_REF
IDENT "c"
WHITESPACE " "
NEQ "!="
WHITESPACE " "
LITERAL
STRING "'b'"
SEMICOLON ";"
WHITESPACE "\n\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
HAVING_CLAUSE
HAVING_KW "having"
WHITESPACE " "
ERROR
AND_KW "and"
WHITESPACE " "
BIN_EXPR
NAME_REF
IDENT "c"
WHITESPACE " "
R_ANGLE ">"
WHITESPACE " "
LITERAL
INT_NUMBER "10"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
HAVING_CLAUSE
HAVING_KW "having"
WHITESPACE " "
ERROR
OR_KW "or"
WHITESPACE " "
BIN_EXPR
NAME_REF
IDENT "c"
WHITESPACE " "
NEQ "!="
WHITESPACE " "
LITERAL
STRING "'b'"
SEMICOLON ";"
WHITESPACE "\n\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
JOIN_EXPR
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
WHITESPACE " "
JOIN
JOIN_INNER
JOIN_KW "join"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "u"
WHITESPACE " "
ON_CLAUSE
ON_KW "on"
WHITESPACE " "
ERROR
AND_KW "and"
WHITESPACE " "
LITERAL
TRUE_KW "true"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
JOIN_EXPR
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
WHITESPACE " "
JOIN
JOIN_INNER
JOIN_KW "join"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "u"
WHITESPACE " "
ON_CLAUSE
ON_KW "on"
WHITESPACE " "
ERROR
OR_KW "or"
WHITESPACE " "
LITERAL
TRUE_KW "true"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- join after the where"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
WHITESPACE "\n"
WHERE_CLAUSE
WHERE_KW "where"
WHITESPACE " "
BIN_EXPR
NAME_REF
IDENT "x"
WHITESPACE " "
R_ANGLE ">"
WHITESPACE " "
LITERAL
INT_NUMBER "1"
WHITESPACE "\n"
ERROR
JOIN
JOIN_INNER
JOIN_KW "join"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "k"
WHITESPACE " "
ON_CLAUSE
ON_KW "on"
WHITESPACE " "
LITERAL
TRUE_KW "true"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- having after order by instead of before"
WHITESPACE "\n"
SELECT
WITH_CLAUSE
WITH_KW "with"
WHITESPACE " "
WITH_TABLE
CTE_NAME
IDENT "t"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
L_PAREN "("
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "2"
WHITESPACE " "
AS_NAME
COLUMN_NAME
IDENT "b"
R_PAREN ")"
WHITESPACE "\n"
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
AS_NAME
COLUMN_NAME
IDENT "a"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
WHITESPACE "\n"
GROUP_BY_CLAUSE
GROUP_KW "group"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
GROUP_BY_LIST
GROUPING_EXPR
NAME_REF
IDENT "a"
WHITESPACE "\n"
ORDER_BY_CLAUSE
ORDER_KW "order"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
SORT_BY_LIST
SORT_BY
NAME_REF
IDENT "a"
WHITESPACE "\n"
ERROR
HAVING_CLAUSE
HAVING_KW "having"
WHITESPACE " "
BIN_EXPR
NAME_REF
IDENT "a"
WHITESPACE " "
R_ANGLE ">"
WHITESPACE " "
LITERAL
INT_NUMBER "10"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- select end"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE "\n"
COMMIT_TRANSACTION
END_KW "end"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- select analyze/analyse"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE "\n"
ANALYZE
ANALYZE_KW "analyze"
SEMICOLON ";"
WHITESPACE "\n\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE "\n"
ANALYZE
ANALYSE_KW "analyse"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- select with"
WHITESPACE "\n\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE "\n"
SELECT
WITH_CLAUSE
WITH_KW "with"
WHITESPACE " "
WITH_TABLE
CTE_NAME
IDENT "t"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
L_PAREN "("
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
R_PAREN ")"
WHITESPACE "\n"
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "t"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- semicolon not allowed"
WHITESPACE "\n"
PAREN_SELECT
L_PAREN "("
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
SEMICOLON ";"
ERROR
R_PAREN ")"
EMPTY_STMT
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- compound select requires a select on the left"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
PAREN_EXPR
L_PAREN "("
COMPOUND_SELECT
LITERAL
INT_NUMBER "1"
WHITESPACE " "
UNION
UNION_KW "union"
WHITESPACE " "
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "2"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
PAREN_EXPR
L_PAREN "("
COMPOUND_SELECT
PAREN_EXPR
L_PAREN "("
LITERAL
INT_NUMBER "1"
R_PAREN ")"
WHITESPACE " "
UNION
UNION_KW "union"
WHITESPACE " "
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "2"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
PAREN_EXPR
L_PAREN "("
COMPOUND_SELECT
PAREN_EXPR
L_PAREN "("
PAREN_EXPR
L_PAREN "("
PAREN_EXPR
L_PAREN "("
PAREN_EXPR
L_PAREN "("
LITERAL
INT_NUMBER "1"
R_PAREN ")"
R_PAREN ")"
R_PAREN ")"
R_PAREN ")"
WHITESPACE " "
UNION
UNION_KW "union"
WHITESPACE " "
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- compound w/ empty parens"
WHITESPACE "\n"
COMPOUND_SELECT
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
UNION
UNION_KW "union"
WHITESPACE " "
PAREN_SELECT
L_PAREN "("
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- compound missing select"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
PAREN_FROM_ITEM
PAREN_EXPR
L_PAREN "("
COMPOUND_SELECT
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "foo"
WHITESPACE " "
UNION
UNION_KW "union"
WHITESPACE " "
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- compound operators must precede trailing clauses"
WHITESPACE "\n"
COMPOUND_SELECT
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
LIMIT_CLAUSE
LIMIT_KW "limit"
WHITESPACE " "
LITERAL
INT_NUMBER "1"
WHITESPACE " "
UNION
UNION_KW "union"
WHITESPACE " "
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "2"
SEMICOLON ";"
WHITESPACE "\n"
COMPOUND_SELECT
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
ORDER_BY_CLAUSE
ORDER_KW "order"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
SORT_BY_LIST
SORT_BY
LITERAL
INT_NUMBER "1"
WHITESPACE " "
INTERSECT
INTERSECT_KW "intersect"
WHITESPACE " "
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "2"
SEMICOLON ";"
WHITESPACE "\n"
COMPOUND_SELECT
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
OFFSET_CLAUSE
OFFSET_KW "offset"
WHITESPACE " "
LITERAL
INT_NUMBER "1"
WHITESPACE " "
EXCEPT
EXCEPT_KW "except"
WHITESPACE " "
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "2"
SEMICOLON ";"
WHITESPACE "\n"
COMPOUND_SELECT
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
FETCH_CLAUSE
FETCH_KW "fetch"
WHITESPACE " "
FIRST_KW "first"
WHITESPACE " "
LITERAL
INT_NUMBER "1"
WHITESPACE " "
ROW_KW "row"
WHITESPACE " "
FETCH_ONLY
ONLY_KW "only"
WHITESPACE " "
UNION
UNION_KW "union"
WHITESPACE " "
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "2"
SEMICOLON ";"
WHITESPACE "\n"
COMPOUND_SELECT
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
LOCKING_CLAUSE
FOR_KW "for"
WHITESPACE " "
FOR_UPDATE
UPDATE_KW "update"
WHITESPACE " "
UNION
UNION_KW "union"
WHITESPACE " "
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "2"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- WITH is only allowed at the start of a compound select"
WHITESPACE "\n"
COMPOUND_SELECT
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
UNION
UNION_KW "union"
WHITESPACE " "
SELECT
WITH_CLAUSE
WITH_KW "with"
WHITESPACE " "
WITH_TABLE
CTE_NAME
IDENT "x"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
L_PAREN "("
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "2"
R_PAREN ")"
WHITESPACE " "
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "x"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- ALL and DISTINCT are only allowed before the first function argument"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
NAME_REF
IDENT "f"
ARG_LIST
L_PAREN "("
ARG
LITERAL
INT_NUMBER "1"
COMMA ","
WHITESPACE " "
ERROR
ALL_KW "all"
WHITESPACE " "
ARG
LITERAL
INT_NUMBER "2"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
NAME_REF
IDENT "f"
ARG_LIST
L_PAREN "("
ARG
LITERAL
INT_NUMBER "1"
COMMA ","
WHITESPACE " "
ERROR
DISTINCT_KW "distinct"
WHITESPACE " "
ARG
LITERAL
INT_NUMBER "2"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- only column def list list allowed, not alias"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
ROWS_FROM_ITEM
ROWS_KW "rows"
WHITESPACE " "
FROM_KW "from"
WHITESPACE " "
L_PAREN "("
ROWS_FROM_ARG
CALL_EXPR
NAME_REF
IDENT "f"
ARG_LIST
L_PAREN "("
R_PAREN ")"
WHITESPACE " "
ROWS_FROM_ARG
NAME_REF
IDENT "t"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
ROWS_FROM_ITEM
ROWS_KW "rows"
WHITESPACE " "
FROM_KW "from"
WHITESPACE " "
L_PAREN "("
ROWS_FROM_ARG
CALL_EXPR
NAME_REF
IDENT "f"
ARG_LIST
L_PAREN "("
R_PAREN ")"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
ROWS_FROM_ARG
CALL_EXPR
NAME_REF
IDENT "t"
ARG_LIST
L_PAREN "("
ARG
NAME_REF
IDENT "a"
WHITESPACE " "
ARG
NAME_REF
INT_KW "int"
R_PAREN ")"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- column def columns a type"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
ROWS_FROM_ITEM
ROWS_KW "rows"
WHITESPACE " "
FROM_KW "from"
WHITESPACE " "
L_PAREN "("
ROWS_FROM_ARG
CALL_EXPR
NAME_REF
IDENT "f"
ARG_LIST
L_PAREN "("
R_PAREN ")"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
COLUMN_DEF_LIST
L_PAREN "("
COLUMN_DEF
COLUMN_NAME
IDENT "a"
R_PAREN ")"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- only allowed at top level"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
NAME_REF
IDENT "f"
ARG_LIST
L_PAREN "("
ARG
BIN_EXPR
LITERAL
INT_NUMBER "1"
WHITESPACE " "
PLUS "+"
WHITESPACE " "
TUPLE_EXPR
L_PAREN "("
NAME_REF
IDENT "a"
WHITESPACE " "
PREFIX_EXPR
CUSTOM_OP
EQ "="
R_ANGLE ">"
WHITESPACE " "
LITERAL
INT_NUMBER "2"
R_PAREN ")"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
NAME_REF
IDENT "f"
ARG_LIST
L_PAREN "("
ARG
PAREN_EXPR
L_PAREN "("
NAME_REF
IDENT "a"
R_PAREN ")"
WHITESPACE " "
ARG
PREFIX_EXPR
CUSTOM_OP
EQ "="
R_ANGLE ">"
WHITESPACE " "
LITERAL
INT_NUMBER "2"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- trailing comma at EOF"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
ERROR
COMMA ","
WHITESPACE "\n\n"
COMMENT "-- collate must follow cast"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
COLLATE
CAST_EXPR
CAST_KW "cast"
L_PAREN "("
LITERAL
STRING "'42'"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PATH_TYPE
PATH_REF
PATH_SEGMENT_REF
TEXT_KW "text"
WHITESPACE " "
COLLATE_KW "collate"
WHITESPACE " "
COLLATION_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "\"C\""
ERROR
R_PAREN ")"
EMPTY_STMT
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- postgres' expr_list has no empty production"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
GROUP_BY_CLAUSE
GROUP_KW "group"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
GROUP_BY_LIST
GROUPING_ROLLUP
ROLLUP_KW "rollup"
WHITESPACE " "
L_PAREN "("
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
GROUP_BY_CLAUSE
GROUP_KW "group"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
GROUP_BY_LIST
GROUPING_CUBE
CUBE_KW "cube"
WHITESPACE " "
L_PAREN "("
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
DISTINCT_CLAUSE
DISTINCT_KW "distinct"
WHITESPACE " "
DISTINCT_ON
ON_KW "on"
WHITESPACE " "
L_PAREN "("
R_PAREN ")"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- GROUP BY requires at least one item"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
GROUP_BY_CLAUSE
GROUP_KW "group"
WHITESPACE " "
BY_KW "by"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
GROUP_BY_CLAUSE
GROUP_KW "group"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
DISTINCT
DISTINCT_KW "distinct"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- GROUP BY lists cannot end before the following clause"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
GROUP_BY_CLAUSE
GROUP_KW "group"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
GROUP_BY_LIST
GROUPING_EXPR
NAME_REF
IDENT "a"
COMMA ","
WHITESPACE " "
ORDER_BY_CLAUSE
ORDER_KW "order"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
SORT_BY_LIST
SORT_BY
NAME_REF
IDENT "b"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
WITH_CLAUSE
WITH_KW "with"
WHITESPACE " "
WITH_TABLE
CTE_NAME
IDENT "x"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
L_PAREN "("
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
GROUP_BY_CLAUSE
GROUP_KW "group"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
GROUP_BY_LIST
GROUPING_EXPR
NAME_REF
IDENT "a"
COMMA ","
R_PAREN ")"
WHITESPACE "\n"
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
RELATION_FROM_ITEM
RELATION_NAME_REF
PATH_REF
PATH_SEGMENT_REF
IDENT "x"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- ORDER BY requires an item and cannot end with a comma"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
ORDER_BY_CLAUSE
ORDER_KW "order"
WHITESPACE " "
BY_KW "by"
SORT_BY_LIST
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
ORDER_BY_CLAUSE
ORDER_KW "order"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
SORT_BY_LIST
SORT_BY
NAME_REF
IDENT "a"
COMMA ","
WHITESPACE " "
LIMIT_CLAUSE
LIMIT_KW "limit"
WHITESPACE " "
LITERAL
INT_NUMBER "1"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
NAME_REF
IDENT "array_agg"
ARG_LIST
L_PAREN "("
ARG
NAME_REF
IDENT "a"
WHITESPACE " "
ORDER_BY_CLAUSE
ORDER_KW "order"
WHITESPACE " "
BY_KW "by"
SORT_BY_LIST
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
NAME_REF
IDENT "array_agg"
ARG_LIST
L_PAREN "("
ARG
NAME_REF
IDENT "a"
WHITESPACE " "
ORDER_BY_CLAUSE
ORDER_KW "order"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
SORT_BY_LIST
SORT_BY
NAME_REF
IDENT "a"
COMMA ","
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- only function names can be followed by an argument list"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
TUPLE_EXPR
L_PAREN "("
R_PAREN ")"
ARG_LIST
L_PAREN "("
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
LITERAL
INT_NUMBER "1"
ARG_LIST
L_PAREN "("
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
PAREN_EXPR
L_PAREN "("
NAME_REF
IDENT "f"
R_PAREN ")"
ARG_LIST
L_PAREN "("
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
CALL_EXPR
NAME_REF
IDENT "f"
ARG_LIST
L_PAREN "("
R_PAREN ")"
ARG_LIST
L_PAREN "("
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
INDEX_EXPR
NAME_REF
IDENT "f"
L_BRACK "["
LITERAL
INT_NUMBER "1"
R_BRACK "]"
ARG_LIST
L_PAREN "("
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
CALL_EXPR
FIELD_EXPR
PAREN_EXPR
L_PAREN "("
NAME_REF
IDENT "f"
R_PAREN ")"
DOT "."
NAME_REF
IDENT "g"
ARG_LIST
L_PAREN "("
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- bare aliases are only allowed in target elements"
WHITESPACE "\n"
SELECT
SELECT_CLAUSE
SELECT_KW "SELECT"
WHITESPACE " "
TARGET_LIST
TARGET
TUPLE_EXPR
L_PAREN "("
WHITESPACE "\n "
BIN_EXPR
PAREN_EXPR
L_PAREN "("
BIN_EXPR
LITERAL
INT_NUMBER "1"
WHITESPACE " "
AND_KW "AND"
WHITESPACE " "
BIN_EXPR
INDEX_EXPR
NAME_REF
IDENT "p"
L_BRACK "["
R_BRACK "]"
WHITESPACE " "
EQ "="
WHITESPACE " "
CAST_EXPR
LITERAL
STRING "''"
COLON_COLON
COLON ":"
COLON ":"
PATH_TYPE
PATH_REF
PATH_SEGMENT_REF
IDENT "r"
R_PAREN ")"
WHITESPACE " "
OR_KW "OR"
ERROR
COMMA ","
WHITESPACE "\n "
CALL_EXPR
PAREN_EXPR
L_PAREN "("
BIN_EXPR
BIN_EXPR
LITERAL
INT_NUMBER "2"
WHITESPACE " "
AND_KW "AND"
WHITESPACE " "
BIN_EXPR
INDEX_EXPR
NAME_REF
IDENT "p"
L_BRACK "["
R_BRACK "]"
WHITESPACE " "
EQ "="
WHITESPACE " "
CAST_EXPR
LITERAL
STRING "''"
COLON_COLON
COLON ":"
COLON ":"
PATH_TYPE
PATH_REF
PATH_SEGMENT_REF
IDENT "r"
WHITESPACE " "
AND_KW "AND"
WHITESPACE " "
BIN_EXPR
INDEX_EXPR
NAME_REF
IDENT "p"
L_BRACK "["
R_BRACK "]"
WHITESPACE " "
EQ "="
WHITESPACE " "
CAST_EXPR
LITERAL
STRING "''"
COLON_COLON
COLON ":"
COLON ":"
PATH_TYPE
PATH_REF
PATH_SEGMENT_REF
IDENT "r"
R_PAREN ")"
ARG_LIST
L_PAREN "("
WHITESPACE "\n "
ARG
BIN_EXPR
BIN_EXPR
BIN_EXPR
LITERAL
INT_NUMBER "3"
WHITESPACE " "
AND_KW "AND"
WHITESPACE " "
BIN_EXPR
INDEX_EXPR
NAME_REF
IDENT "p"
L_BRACK "["
R_BRACK "]"
WHITESPACE " "
EQ "="
WHITESPACE " "
CAST_EXPR
LITERAL
STRING "''"
COLON_COLON
COLON ":"
COLON ":"
PATH_TYPE
PATH_REF
PATH_SEGMENT_REF
IDENT "r"
WHITESPACE " "
AND_KW "AND"
WHITESPACE " "
BIN_EXPR
INDEX_EXPR
NAME_REF
IDENT "p"
L_BRACK "["
R_BRACK "]"
WHITESPACE " "
EQ "="
WHITESPACE " "
CAST_EXPR
LITERAL
STRING "''"
COLON_COLON
COLON ":"
COLON ":"
PATH_TYPE
PATH_REF
PATH_SEGMENT_REF
IDENT "r"
WHITESPACE " "
AND_KW "AND"
WHITESPACE " "
BIN_EXPR
INDEX_EXPR
NAME_REF
IDENT "p"
L_BRACK "["
R_BRACK "]"
WHITESPACE " "
EQ "="
WHITESPACE " "
CAST_EXPR
LITERAL
STRING "''"
COLON_COLON
COLON ":"
COLON ":"
PATH_TYPE
PATH_REF
PATH_SEGMENT_REF
IDENT "r"
WHITESPACE "\n "
R_PAREN ")"
WHITESPACE "\n"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
---
error[syntax-error]: unexpected trailing comma
╭▸
4 │ array['a', 'b', 'c',] as y,
╰╴ ━
error[syntax-error]: unexpected trailing comma
╭▸
5 │ 'hello world' as z,
╰╴ ━
error[syntax-error]: unexpected trailing comma
╭▸
9 │ select * from t as u(a,);
╰╴ ━
error[syntax-error]: missing comma
╭▸
12 │ select a, b c d, e from t;
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
17 │ SELECT DISTINCT ON (a b) a, b, c
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
22 │ select * from t group by rollup (1 2 3);
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
22 │ select * from t group by rollup (1 2 3);
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
23 │ select * from t group by cube (1 2 3);
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
23 │ select * from t group by cube (1 2 3);
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
25 │ group by grouping sets((1 2) grouping sets((), grouping sets(())));
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
25 │ group by grouping sets((1 2) grouping sets((), grouping sets(())));
╰╴ ━
error[syntax-error]: unexpected trailing comma
╭▸
28 │ select f(1,);
╰╴ ━
error[syntax-error]: expected expression
╭▸
31 │ select f(a,,,,,);
╰╴ ━
error[syntax-error]: expected expression
╭▸
31 │ select f(a,,,,,);
╰╴ ━
error[syntax-error]: expected expression
╭▸
31 │ select f(a,,,,,);
╰╴ ━
error[syntax-error]: expected expression
╭▸
31 │ select f(a,,,,,);
╰╴ ━
error[syntax-error]: missing comma
╭▸
37 │ select numeric 1234;
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
40 │ select array[1 2,3];
╰╴ ━
error[syntax-error]: unexpected comma
╭▸
42 │ select array[1, ,3];
╰╴ ━
error[syntax-error]: unexpected trailing comma
╭▸
44 │ select array[1,2,3,];
╰╴ ━
error[syntax-error]: expected expression in atom_expr
╭▸
47 │ select * from t group by all order by all;
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
50 │ select cast(x as varchar(100 200));
╰╴ ━
error[syntax-error]: unexpected comma
╭▸
51 │ select cast(x as varchar(100, , 200));
╰╴ ━
error[syntax-error]: unexpected trailing comma
╭▸
52 │ select cast(x as t(a, b,));
╰╴ ━
error[syntax-error]: unexpected trailing comma
╭▸
59 │ select a, from t;
╰╴ ━
error[syntax-error]: expected an expression, found END_KW
╭▸
62 │ select case when 1 then end;
╰╴ ━
error[syntax-error]: expected an expression, found THEN_KW
╭▸
65 │ select case when then x end;
╰╴ ━
error[syntax-error]: expected an expression, found END_KW
╭▸
68 │ select case when 1 then 2 else end;
╰╴ ━
error[syntax-error]: expected expression but got AND_KW
╭▸
84 │ select from t where and c > 10;
╰╴ ━
error[syntax-error]: expected expression but got OR_KW
╭▸
85 │ select from t where or c != 'b';
╰╴ ━
error[syntax-error]: expected expression but got AND_KW
╭▸
87 │ select having and c > 10;
╰╴ ━
error[syntax-error]: expected expression but got OR_KW
╭▸
88 │ select having or c != 'b';
╰╴ ━
error[syntax-error]: expected expression but got AND_KW
╭▸
90 │ select from t join u on and true;
╰╴ ━
error[syntax-error]: expected expression but got OR_KW
╭▸
91 │ select from t join u on or true;
╰╴ ━
error[syntax-error]: JOINs must appear before WHERE
╭▸
96 │ join k on true;
╰╴━
error[syntax-error]: HAVING must appear before ORDER BY
╭▸
103 │ having a > 10;
╰╴━
error[syntax-error]: expected R_PAREN
╭▸
123 │ (select 1;);
╰╴ ━
error[syntax-error]: expected command, found R_PAREN
╭▸
123 │ (select 1;);
╰╴ ━
error[syntax-error]: expected select before compound select operator
╭▸
126 │ select (1 union select 2);
╰╴ ━
error[syntax-error]: expected select before compound select operator
╭▸
127 │ select ((1) union select 2);
╰╴ ━
error[syntax-error]: expected select before compound select operator
╭▸
128 │ select (((((1)))) union select 1);
╰╴ ━
error[syntax-error]: expected start of a select statement
╭▸
131 │ select 1 union ();
╰╴ ━
error[syntax-error]: expected select before compound select operator
╭▸
134 │ select * from (foo union select 1);
╰╴ ━
error[syntax-error]: UNION, INTERSECT, EXCEPT must come before ORDER BY, LIMIT, OFFSET, FETCH, and locking clauses
╭▸
137 │ select 1 limit 1 union select 2;
╰╴ ━
error[syntax-error]: UNION, INTERSECT, EXCEPT must come before ORDER BY, LIMIT, OFFSET, FETCH, and locking clauses
╭▸
138 │ select 1 order by 1 intersect select 2;
╰╴ ━
error[syntax-error]: UNION, INTERSECT, EXCEPT must come before ORDER BY, LIMIT, OFFSET, FETCH, and locking clauses
╭▸
139 │ select 1 offset 1 except select 2;
╰╴ ━
error[syntax-error]: UNION, INTERSECT, EXCEPT must come before ORDER BY, LIMIT, OFFSET, FETCH, and locking clauses
╭▸
140 │ select 1 fetch first 1 row only union select 2;
╰╴ ━
error[syntax-error]: UNION, INTERSECT, EXCEPT must come before ORDER BY, LIMIT, OFFSET, FETCH, and locking clauses
╭▸
141 │ select 1 for update union select 2;
╰╴ ━
error[syntax-error]: a WITH clause is only allowed at the start of a select statement
╭▸
144 │ select 1 union with x as (select 2) select * from x;
╰╴ ━
error[syntax-error]: ALL or DISTINCT is only allowed before the first argument
╭▸
147 │ select f(1, all 2);
╰╴ ━
error[syntax-error]: ALL or DISTINCT is only allowed before the first argument
╭▸
148 │ select f(1, distinct 2);
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
151 │ select * from rows from (f() t);
╰╴ ━
error[syntax-error]: expected call expression
╭▸
151 │ select * from rows from (f() t);
╰╴ ━
error[syntax-error]: expected column definition list
╭▸
152 │ select * from rows from (f() as t(a int));
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
152 │ select * from rows from (f() as t(a int));
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
152 │ select * from rows from (f() as t(a int));
╰╴ ━
error[syntax-error]: expected a type
╭▸
155 │ select * from rows from (f() as (a));
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
158 │ select f(1 + (a => 2));
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
159 │ select f((a) => 2);
╰╴ ━
error[syntax-error]: unexpected trailing comma
╭▸
162 │ select 1,
╰╴ ━
error[syntax-error]: expected R_PAREN
╭▸
165 │ select cast('42' as text collate "C");
╰╴ ━
error[syntax-error]: expected command, found R_PAREN
╭▸
165 │ select cast('42' as text collate "C");
╰╴ ━
error[syntax-error]: Expected at least one item
╭▸
168 │ select 1 group by rollup ();
╰╴ ━
error[syntax-error]: Expected at least one item
╭▸
169 │ select 1 group by cube ();
╰╴ ━
error[syntax-error]: Expected at least one item
╭▸
170 │ select distinct on () 1;
╰╴ ━
error[syntax-error]: Expected at least one GROUP BY item
╭▸
173 │ select 1 group by;
╰╴ ━
error[syntax-error]: Expected at least one GROUP BY item
╭▸
174 │ select 1 group by distinct;
╰╴ ━
error[syntax-error]: Expected a GROUP BY item after comma
╭▸
177 │ select 1 group by a, order by b;
╰╴ ━
error[syntax-error]: Expected a GROUP BY item after comma
╭▸
178 │ with x as (select 1 group by a,)
╰╴ ━
error[syntax-error]: Expected at least one ORDER BY item
╭▸
182 │ select 1 order by;
╰╴ ━
error[syntax-error]: Expected an ORDER BY item after comma
╭▸
183 │ select 1 order by a, limit 1;
╰╴ ━
error[syntax-error]: Expected at least one ORDER BY item
╭▸
184 │ select array_agg(a order by);
╰╴ ━
error[syntax-error]: Expected an ORDER BY item after comma
╭▸
185 │ select array_agg(a order by a,);
╰╴ ━
error[syntax-error]: Expected an expression
╭▸
188 │ select ()();
╰╴ ━
error[syntax-error]: expected function name before argument list
╭▸
188 │ select ()();
╰╴ ━
error[syntax-error]: expected function name before argument list
╭▸
189 │ select 1();
╰╴ ━
error[syntax-error]: expected function name before argument list
╭▸
190 │ select (f)();
╰╴ ━
error[syntax-error]: expected function name before argument list
╭▸
191 │ select f()();
╰╴ ━
error[syntax-error]: expected function name before argument list
╭▸
192 │ select f[1]();
╰╴ ━
error[syntax-error]: expected function name before argument list
╭▸
193 │ select (f).g();
╰╴ ━
error[syntax-error]: expected an expression, found COMMA
╭▸
197 │ (1 AND p[] = ''::r) OR,
╰╴ ━
error[syntax-error]: expected COMMA
╭▸
197 │ (1 AND p[] = ''::r) OR,
│ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━┛
198 │ ┃ (2 AND p[] = ''::r AND p[] = ''::r)(
╰╴┗━┛
error[syntax-error]: expected function name before argument list
╭▸
198 │ (2 AND p[] = ''::r AND p[] = ''::r)(
╰╴ ━