diff --git a/sql/snowflake/SnowflakeLexer.g4 b/sql/snowflake/SnowflakeLexer.g4 index 0e72ba15f7..b972688200 100644 --- a/sql/snowflake/SnowflakeLexer.g4 +++ b/sql/snowflake/SnowflakeLexer.g4 @@ -230,10 +230,10 @@ CSV : 'CSV'; CSV_Q : '\'CSV\''; CUBE : 'CUBE'; // CUME_DIST: 'CUME_DIST'; -CURRENT : 'CURRENT'; -CURRENT_DATE : 'CURRENT_DATE'; -// CURRENT_TIME: 'CURRENT_TIME'; -CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'; +CURRENT : 'CURRENT'; +CURRENT_DATE : 'CURRENT_DATE'; +CURRENT_TIME : 'CURRENT_TIME'; +CURRENT_TIMESTAMP : 'CURRENT_TIMESTAMP'; // CURRENT_USER: 'CURRENT_USER'; // CURSOR: 'CURSOR'; CUSTOM : 'CUSTOM'; @@ -250,8 +250,8 @@ DATE_FORMAT : 'DATE_FORMAT'; DATE_INPUT_FORMAT : 'DATE_INPUT_FORMAT'; DATE_OUTPUT_FORMAT : 'DATE_OUTPUT_FORMAT'; DATE_PART : 'DATE_PART'; -// DAYS: 'DAYS'; -DAYS_TO_EXPIRY: 'DAYS_TO_EXPIRY'; +DAYS : 'DAYS'; +DAYS_TO_EXPIRY : 'DAYS_TO_EXPIRY'; // DECLARE: 'DECLARE'; DEFAULT : 'DEFAULT'; DEFAULT_DDL_COLLATION_ : 'DEFAULT_DDL_COLLATION'; @@ -405,9 +405,9 @@ HEADER : 'HEADER'; HEADERS : 'HEADERS'; HEX : 'HEX'; // HIERARCHYID: 'HIERARCHYID'; -// HIGH: 'HIGH'; -HISTORY: 'HISTORY'; -// HOURS: 'HOURS'; +HIGH : 'HIGH'; +HISTORY : 'HISTORY'; +HOURS : 'HOURS'; IDENTIFIER : 'IDENTIFIER'; IDENTITY : 'IDENTITY'; IF : 'IF'; @@ -498,12 +498,12 @@ LOCK_TIMEOUT : 'LOCK_TIMEOUT'; // LOGIN: 'LOGIN'; LOGIN_NAME : 'LOGIN_NAME'; LOOKER : 'LOOKER'; -// LOW: 'LOW'; -LOWER : 'LOWER'; -LTRIM : 'LTRIM'; -LZO : 'LZO'; -MANAGE : 'MANAGE'; -MANAGED : 'MANAGED'; +LOW : 'LOW'; +LOWER : 'LOWER'; +LTRIM : 'LTRIM'; +LZO : 'LZO'; +MANAGE : 'MANAGE'; +MANAGED : 'MANAGED'; // MASK: 'MASK'; // MASKED: 'MASKED'; MASKING: 'MASKING'; @@ -684,8 +684,8 @@ PREVENT_UNLOAD_TO_INTERNAL_STAGES : 'PREVENT_UNLOAD_TO_INTERNAL_STAGES'; PRE_AUTHORIZED_ROLES_LIST : 'PRE_AUTHORIZED_ROLES_LIST'; PRIMARY : 'PRIMARY'; // PRIMARY_ROLE: 'PRIMARY_ROLE'; -PRIOR: 'PRIOR'; -// PRIORITY: 'PRIORITY'; +PRIOR : 'PRIOR'; +PRIORITY : 'PRIORITY'; // PRIORITY_LEVEL: 'PRIORITY_LEVEL'; // PRIVATE: 'PRIVATE'; // PRIVATE_KEY: 'PRIVATE_KEY'; @@ -699,13 +699,14 @@ PROCEDURE_NAME : 'PROCEDURE_NAME'; PROPERTY : 'PROPERTY'; PROVIDER : 'PROVIDER'; // PROVIDER_KEY_NAME: 'PROVIDER_KEY_NAME'; -PUBLIC : 'PUBLIC'; -PURGE : 'PURGE'; -PUT : 'PUT'; -PYTHON : 'PYTHON'; -QUALIFY : 'QUALIFY'; -QUERIES : 'QUERIES'; -// QUERY: 'QUERY'; +PUBLIC : 'PUBLIC'; +PURGE : 'PURGE'; +PUT : 'PUT'; +PYTHON : 'PYTHON'; +QUALIFY : 'QUALIFY'; +QUARTER : 'QUARTER'; +QUERIES : 'QUERIES'; +QUERY : 'QUERY'; QUERY_ACCELERATION_MAX_SCALE_FACTOR : 'QUERY_ACCELERATION_MAX_SCALE_FACTOR'; QUERY_TAG : 'QUERY_TAG'; QUEUE : 'QUEUE'; @@ -901,8 +902,8 @@ STANDARD : 'STANDARD'; // STANDBY: 'STANDBY'; START: 'START'; // STARTED: 'STARTED'; -STARTS: 'STARTS'; -// START_DATE: 'START_DATE'; +STARTS : 'STARTS'; +START_DATE : 'START_DATE'; START_TIMESTAMP : 'START_TIMESTAMP'; STATE : 'STATE'; STATEMENT : 'STATEMENT'; @@ -913,7 +914,7 @@ STATEMENT_TIMEOUT_IN_SECONDS : 'STATEMENT_TIMEOUT_IN_SECONDS'; STATS: 'STATS'; // STATS_DATE: 'STATS_DATE'; // STATS_STREAM: 'STATS_STREAM'; -// STATUS: 'STATUS'; +STATUS: 'STATUS'; // STATUSONLY: 'STATUSONLY'; // STDEV: 'STDEV'; // STDEVP: 'STDEVP'; @@ -1078,8 +1079,8 @@ VERSION : 'VERSION'; VIEW : 'VIEW'; VIEWS : 'VIEWS'; // VIEW_METADATA: 'VIEW_METADATA'; -// VISIBILITY: 'VISIBILITY'; -VOLATILE: 'VOLATILE'; +VISIBILITY : 'VISIBILITY'; +VOLATILE : 'VOLATILE'; // WAIT: 'WAIT'; WAREHOUSE : 'WAREHOUSE'; WAREHOUSES : 'WAREHOUSES'; @@ -1108,6 +1109,7 @@ XSMALL : 'XSMALL'; XXLARGE : 'XXLARGE'; XXXLARGE : 'XXXLARGE'; YEARLY : 'YEARLY'; +YEAR : 'YEAR'; ZSTD : 'ZSTD'; ARRAY : 'ARRAY'; diff --git a/sql/snowflake/SnowflakeParser.g4 b/sql/snowflake/SnowflakeParser.g4 index ff8addd993..472e31f831 100644 --- a/sql/snowflake/SnowflakeParser.g4 +++ b/sql/snowflake/SnowflakeParser.g4 @@ -2347,7 +2347,7 @@ create_stream //-- table or view : CREATE or_replace? STREAM if_not_exists? object_name with_tags? copy_grants? ON ( TABLE - |VIEW + | VIEW ) object_name stream_time? append_only? show_initial_rows? comment_clause? //-- External table | CREATE or_replace? STREAM if_not_exists? object_name with_tags? copy_grants? ON EXTERNAL TABLE object_name stream_time? insert_only? @@ -2459,8 +2459,8 @@ create_table_clause : ( column_decl_item_list_paren cluster_by? | cluster_by? comment_clause? column_decl_item_list_paren - ) stage_file_format? (STAGE_COPY_OPTIONS EQ LR_BRACKET copy_options RR_BRACKET)? set_data_retention_params? change_tracking? - default_ddl_collation? copy_grants? comment_clause? with_row_access_policy? with_tags? + ) stage_file_format? (STAGE_COPY_OPTIONS EQ LR_BRACKET copy_options RR_BRACKET)? set_data_retention_params? change_tracking? default_ddl_collation + ? copy_grants? comment_clause? with_row_access_policy? with_tags? ; create_table_as_select @@ -3559,9 +3559,10 @@ keyword //List here keyword (SnowSQL meaning) allowed as object name // Name of builtin function should be included in specifique section (ie builtin_function) // please add in alphabetic order for easy reading + // https://docs.snowflake.com/en/sql-reference/reserved-keywords : ACCOUNT - | ALERT | ACTION + | ALERT | AT_KEYWORD | CLUSTER | COMMENT @@ -3595,6 +3596,7 @@ keyword | TAG | TARGET_LAG | TEMP + | TIMESTAMP | TYPE | USER | VALUE @@ -3609,29 +3611,40 @@ non_reserved_words // please add in alphabetic order for easy reading : ACCOUNTADMIN | AES + | ALLOW_OVERLAPPING_EXECUTION | ARRAY_AGG | CHECKSUM | COLLECTION + | COMMENT | CONFIGURATION | DATA + | DAYS | DEFINITION | DELTA + | DISPLAY_NAME | DOWNSTREAM | DYNAMIC | EDITION - | ENABLED | EMAIL | EMPTY_ + | ENABLED + | ERROR_INTEGRATION | EVENT | EXCHANGE | EXPIRY_DATE | EXPR + | FILE + | FILES | FIRST_NAME | FIRST_VALUE + | FREQUENCY | GLOBAL + | HIGH + | HOURS | IDENTIFIER | IDENTITY | INCREMENTAL + | IMPORTED | INDEX | INITIALIZE | INPUT @@ -3641,8 +3654,14 @@ non_reserved_words | LAST_QUERY_ID | LEAD | LOCAL + | LOW + | MAX_CONCURRENCY_LEVEL + | MEDIUM + | MODE | NAME | NETWORK + | NULLIF + | NVL | OFFSET | OLD | ON_CREATE @@ -3651,6 +3670,8 @@ non_reserved_words | OPTION | ORGADMIN | OUTBOUND + | OUTER + | OWNER | PARTITION | PASSWORD | PASSWORD_HISTORY @@ -3667,33 +3688,47 @@ non_reserved_words | PATH_ | PATTERN | PORT + | PRIORITY | PROCEDURE_NAME | PROPERTY | PROVIDER | PUBLIC + | QUARTER + | QUERY + | QUERY_TAG | RANK + | RECURSIVE + | REFERENCES | REFRESH_MODE | RESOURCE | RESOURCES | RESPECT | RESTRICT | RESULT + | ROLE | ROUNDING_MODE + | ROW_NUMBER | SCALE + | SCHEDULE | SECURITYADMIN | SOURCE | START_DATE | STATE | STATS + | STATUS | SYSADMIN + | TAG + | TAGS + | TARGET_LAG | TIMEZONE | URL | USERADMIN | VALUE | VALUES | VERSION + | VISIBILITY | WAREHOUSE_TYPE - | FREQUENCY + | YEAR ; builtin_function @@ -3704,6 +3739,7 @@ builtin_function | MIN | COUNT | CURRENT_TIMESTAMP + | CURRENT_TIME | CURRENT_DATE | UPPER | LOWER @@ -3831,7 +3867,7 @@ expr | op = ( PLUS | MINUS) expr | expr op = (STAR | DIVIDE | MODULE) expr | expr op = (PLUS | MINUS | PIPE_PIPE) expr - | expr comparison_operator expr + | l = expr comparison_operator r = expr | op = NOT+ expr | expr AND expr //bool operation | expr OR expr //bool operation @@ -3926,10 +3962,14 @@ primitive_expression : DEFAULT //? | NULL_ | id_ ('.' id_)* // json field access + | id_ '.' STAR | full_column_name | literal - | BOTH_Q | ARRAY_Q + | AUTO_Q + | AZURE_Q + | BOTH_Q + | NONE_Q | OBJECT_Q //| json_literal //| arr_literal @@ -4066,7 +4106,7 @@ query_statement ; with_expression - : WITH common_table_expression (COMMA common_table_expression)* + : WITH RECURSIVE? common_table_expression (COMMA common_table_expression)* ; common_table_expression diff --git a/sql/snowflake/examples/select.sql b/sql/snowflake/examples/select.sql index cd4e3878d7..5922c407ee 100644 --- a/sql/snowflake/examples/select.sql +++ b/sql/snowflake/examples/select.sql @@ -125,4 +125,6 @@ with a as ( (select * from b) ) select * -from a; \ No newline at end of file +from a; + +select count(t.*) as ca from t9 as t;