sql-grammar.bnf 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. aggregate_with_filter ::= aggregate_name '(' expression ')' ('FILTER' '(' 'WHERE' filter_clause ')')?
  2. alter_cluster_set ::=
  3. 'ALTER' 'CLUSTER' name 'SET' '(' (cluster_option '=' value)* ')'
  4. ('WITH' with_options)?
  5. alter_cluster_set_with_options ::= 'WITH' '(' 'WAIT' ( ( 'UNTIL' 'READY' '(' (wait_until_ready_option '='? value)* ')' ) | ( 'FOR' '='? duration ) ) ')'
  6. alter_cluster_reset ::=
  7. 'ALTER' 'CLUSTER' name 'RESET' '(' (cluster_option_name)* ')'
  8. alter_connection ::=
  9. 'ALTER' 'CONNECTION' 'IF EXISTS'? name
  10. (
  11. (
  12. 'SET' '(' option '=' value ')'
  13. | ('DROP' | 'RESET') '(' option ')'
  14. )
  15. ( ','
  16. (
  17. 'SET' '(' option '=' value ')'
  18. | ('DROP' | 'RESET') '(' option ')'
  19. )
  20. ) *
  21. | 'ROTATE' 'KEYS'
  22. )
  23. ( 'WITH'? '(' field val ( ',' field val )* ')' )?
  24. alter_default_privileges ::=
  25. 'ALTER' 'DEFAULT' 'PRIVILEGES' 'FOR' (( 'ROLE' | 'USER' ) target_role (',' target_role)* | 'ALL' 'ROLES' ) ( 'IN' 'SCHEMA' schema_name (',' schema_name)* | 'IN' 'DATABASE' database_name (',' database_name)* )? ( abbreviated_grant | abbreviated_revoke )
  26. alter_network_policy::='ALTER' 'NETWORK POLICY' name '(' 'RULES' ( '(' network_policy_rule (',' network_policy_rule)* ')' )? ')'
  27. abbreviated_grant ::=
  28. 'GRANT' ((privilege (',' privilege)*) | 'ALL' 'PRIVILEGES'? ) 'ON' ('TABLES' | 'TYPES' | 'SECRETS' | 'CONNECTIONS' | 'DATABASES' | 'SCHEMAS' | 'CLUSTERS') 'TO' 'GROUP'? grantee (',' grantee)*
  29. abbreviated_revoke ::=
  30. 'REVOKE' ((privilege (',' privilege)*) | 'ALL' 'PRIVILEGES'? ) 'ON' ('TABLES' | 'TYPES' | 'SECRETS' | 'CONNECTIONS' | 'DATABASES' | 'SCHEMAS' | 'CLUSTERS') 'FROM' 'GROUP'? revokee (',' revokee)*
  31. alter_owner ::=
  32. 'ALTER' ('CLUSTER' | 'CLUSTER REPLICA' | 'CONNECTION' | 'DATABASE' | 'SCHEMA' | 'SOURCE' | 'SINK' | 'VIEW' | 'MATERIALIZED VIEW' | 'TABLE' | 'TYPE' | 'SECRET' ) name 'OWNER TO' new_owner
  33. alter_rename ::=
  34. 'ALTER' ('CONNECTION' | 'CLUSTER' | 'CLUSTER REPLICA' | 'INDEX' | 'SCHEMA' | 'SOURCE' | 'SINK' | 'VIEW' | 'MATERIALIZED VIEW' | 'TABLE' | 'SECRET' ) name 'RENAME TO' new_name
  35. alter_swap ::=
  36. 'ALTER' ('CLUSTER' | 'SCHEMA') name 'SWAP' 'WITH' target_name
  37. alter_sink ::=
  38. 'ALTER' 'SINK' name 'SET' 'FROM' item_name
  39. alter_table_set ::=
  40. 'ALTER' 'TABLE' name 'SET' '(' ('RETAIN HISTORY' '='? 'FOR' retention_period) ')'
  41. alter_table_reset ::=
  42. 'ALTER' 'TABLE' name 'RESET' '(' 'RETAIN HISTORY' ')'
  43. alter_index_set ::=
  44. 'ALTER' 'INDEX' name 'SET' ('ENABLED' | ('(' ('RETAIN HISTORY' '='? 'FOR' retention_period) ')'))
  45. alter_index_reset ::=
  46. 'ALTER' 'INDEX' name 'RESET' '(' 'RETAIN HISTORY' ')'
  47. alter_materialized_view_set ::=
  48. 'ALTER' 'MATERIALIZED VIEW' name 'SET' '(' ('RETAIN HISTORY' '='? 'FOR' retention_period) ')'
  49. alter_materialized_view_reset ::=
  50. 'ALTER' 'MATERIALIZED VIEW' name 'RESET' '(' 'RETAIN HISTORY' ')'
  51. alter_role ::=
  52. 'ALTER' 'ROLE' role_name ( alter_role_attributes | alter_role_set )
  53. alter_role_attributes ::= 'WITH'? 'INHERIT'
  54. alter_role_set ::= ('SET' name ( 'TO' | '=' ) ( value | 'DEFAULT' ) | 'RESET' name)
  55. alter_secret ::=
  56. 'ALTER' 'SECRET' 'IF EXISTS'? name AS value
  57. alter_source ::=
  58. 'ALTER' 'SOURCE' 'IF EXISTS'? name (
  59. alter_source_add_clause
  60. | alter_source_set_retain_history_clause
  61. | alter_source_reset_retain_history_clause
  62. )
  63. alter_source_add_clause ::=
  64. 'ADD' ('SUBSOURCE' | 'TABLE') table_name ('AS' subsrc_name)? (',' table_name ('AS' subsrc_name)? )* with_options
  65. alter_source_set_retain_history_clause ::=
  66. 'SET' '(' ('RETAIN HISTORY' '='? 'FOR' retention_period) ')'
  67. alter_source_reset_retain_history_clause ::=
  68. 'RESET' '(' 'RETAIN HISTORY' ')'
  69. alter_system_set_stmt ::=
  70. 'ALTER' 'SYSTEM' 'SET' name ( 'TO' | '=' ) ( value | 'DEFAULT' )
  71. alter_system_reset_stmt ::=
  72. 'ALTER' 'SYSTEM' 'RESET' name
  73. array_agg ::=
  74. 'array_agg' '(' values ( 'ORDER' 'BY' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? ( ',' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? )* )? ')' ('FILTER' '(' 'WHERE' filter_clause ')')?
  75. as_of ::=
  76. 'AS' 'OF' ( 'AT' 'LEAST' )? timestamp_expression
  77. close ::=
  78. 'CLOSE' cursor_name
  79. col_option ::=
  80. 'NOT' 'NULL' |
  81. 'DEFAULT' expr
  82. comment_on ::=
  83. 'COMMENT ON' (
  84. 'CLUSTER' | 'CLUSTER REPLICA' | 'COLUMN' | 'CONNECTION' | 'DATABASE' | 'FUNCTION' |
  85. 'INDEX' | 'MATERIALIZED VIEW' | 'NETWORK POLICY' | 'ROLE' | 'SCHEMA' | 'SECRET' | 'SINK' |
  86. 'SOURCE' | 'TABLE' | 'TYPE' | 'VIEW'
  87. ) object_name 'IS' ( string_literal | 'NULL' )
  88. copy_to_stdout ::=
  89. 'COPY' '(' query ')' 'TO' 'STDOUT'
  90. ( 'WITH'? '(' field val ( ',' field val )* ')' )?
  91. copy_to_s3 ::=
  92. 'COPY' ( query | object_name ) 'TO' s3_uri
  93. '(' 'WITH' 'AWS CONNECTION' connection_name ',' 'FORMAT' ( csv | parquet ) ( ',' field val )* ')'
  94. copy_from ::=
  95. 'COPY' 'INTO'? table_name ('(' column ( ',' column )* ')')? 'FROM' 'STDIN'
  96. ( 'WITH'? '(' field val ( ',' field val )* ')' )?
  97. create_cluster ::=
  98. 'CREATE' 'CLUSTER' name (
  99. 'REPLICAS' '(' (replica_definition (',' replica_definition)*)? ')'
  100. )?
  101. create_managed_cluster ::=
  102. 'CREATE' 'CLUSTER' name '(' cluster_option '=' value (',' cluster_option '=' value)* ')'
  103. cluster_replica_def ::=
  104. replica_name '(' replica_option '=' value ( ',' replica_option '=' value )* ')'
  105. create_cluster_replica ::=
  106. 'CREATE' 'CLUSTER' 'REPLICA' cluster_name '.' replica_name '(' (option '=' value ( ',' option '=' value )*)? ')'
  107. create_connection_aws ::=
  108. 'CREATE' 'CONNECTION' 'IF NOT EXISTS'? connection_name 'TO' 'AWS'
  109. '(' field '='? val ( ',' field '='? val )* ')'
  110. ('WITH' with_options)?
  111. create_connection_kafka ::=
  112. 'CREATE' 'CONNECTION' 'IF NOT EXISTS'? connection_name 'TO' 'KAFKA'
  113. '(' field '='? val ( ',' field '='? val )* ')'
  114. ('WITH' with_options)?
  115. create_connection_csr ::=
  116. 'CREATE' 'CONNECTION' 'IF NOT EXISTS'? connection_name 'TO' 'CONFLUENT' 'SCHEMA' 'REGISTRY'
  117. '(' field '='? val ( ',' field '='? val )* ')'
  118. ('WITH' with_options)?
  119. create_connection_postgres ::=
  120. 'CREATE' 'CONNECTION' 'IF NOT EXISTS'? connection_name 'TO' 'POSTGRES'
  121. '(' field '='? val ( ',' field '='? val )* ')'
  122. ('WITH' with_options)?
  123. create_connection_mysql ::=
  124. 'CREATE' 'CONNECTION' 'IF NOT EXISTS'? connection_name 'TO' 'MYSQL'
  125. '(' field '='? val ( ',' field '='? val )* ')'
  126. ('WITH' with_options)?
  127. create_connection_sql-server ::=
  128. 'CREATE' 'CONNECTION' 'IF NOT EXISTS'? connection_name 'TO' 'SQL SERVER'
  129. '(' field '='? val ( ',' field '='? val )* ')'
  130. ('WITH' with_options)?
  131. create_connection_aws_privatelink ::=
  132. 'CREATE' 'CONNECTION' 'IF NOT EXISTS'? connection_name 'TO' 'AWS' 'PRIVATELINK'
  133. '(' field '='? val ( ',' field '='? val )* ')'
  134. ('WITH' with_options)?
  135. create_connection_ssh_tunnel ::=
  136. 'CREATE' 'CONNECTION' 'IF NOT EXISTS'? connection_name 'TO' 'SSH' 'TUNNEL'
  137. '(' field '='? val ( ',' field '='? val )* ')'
  138. ('WITH' with_options)?
  139. create_connection_kafka_brokers ::= 'BROKERS' '(' kafka_broker (',' kafka_broker)* ')'
  140. create_connection_kafka_broker_aws_privatelink ::=
  141. "'host:port'" 'USING' 'AWS' 'PRIVATELINK' aws_connection ( '(' broker_option (',' broker_option)* ')' )?
  142. create_connection_kafka_default_aws_privatelink ::=
  143. 'AWS' 'PRIVATELINK' aws_connection ( '(' 'PORT' port ')' )?
  144. create_connection_kafka_broker_ssh_tunnel ::=
  145. "'host:port'" 'USING' 'SSH' 'TUNNEL' ssh_connection
  146. broker_option ::= 'PORT' number | 'AVAILABILITY ZONE' az
  147. create_database ::=
  148. 'CREATE' 'DATABASE' ('IF NOT EXISTS')? database_name
  149. create_index ::=
  150. 'CREATE' (
  151. 'INDEX' index_name ('IN' 'CLUSTER' cluster_name)? 'ON' obj_name ('USING' method)? '(' ( ( col_expr ) ( ( ',' col_expr ) )* ) ')'
  152. | 'DEFAULT INDEX' ('IN' 'CLUSTER' cluster_name)? 'ON' obj_name ('USING' method)?
  153. )
  154. with_options?
  155. create_materialized_view ::=
  156. 'CREATE' 'OR REPLACE'? 'MATERIALIZED VIEW' 'IF NOT EXISTS'?
  157. view_name ( '(' col_ident ( ',' col_ident )* ')' )?
  158. ('IN CLUSTER' cluster_name)?
  159. ('WITH' with_options)?
  160. 'AS' select_stmt
  161. create_role ::=
  162. 'CREATE' 'ROLE' role_name ('WITH'? 'INHERIT')?
  163. create_secret ::=
  164. 'CREATE' 'SECRET' ('IF NOT EXISTS')? name 'AS' value
  165. create_schema ::=
  166. 'CREATE' 'SCHEMA' ('IF NOT EXISTS')? schema_name
  167. create_sink_kafka ::=
  168. 'CREATE SINK' 'IF NOT EXISTS'? sink_name sink_definition
  169. sink_definition ::=
  170. ('IN CLUSTER' cluster_name)?
  171. 'FROM' item_name
  172. 'INTO' kafka_sink_connection
  173. ('KEY' '(' key_column ( ',' key_column )* ')' 'NOT ENFORCED'?)?
  174. ('HEADERS' headers_column)?
  175. ('FORMAT' sink_format_spec | 'KEY FORMAT' sink_format_spec 'VALUE FORMAT' sink_format_spec)?
  176. ('ENVELOPE' ('DEBEZIUM'|'UPSERT'))
  177. ('WITH' with_options)?
  178. create_sink_doc_on_option ::=
  179. ('KEY' | 'VALUE')? 'DOC ON' ('TYPE' type_name | 'COLUMN' column_name) '='? string
  180. create_source_kafka ::=
  181. 'CREATE SOURCE' ('IF NOT EXISTS')? src_name
  182. ('(' (col_name) ( ( ',' col_name ) )* ')')?
  183. ('IN CLUSTER' cluster_name)?
  184. 'FROM' 'KAFKA' 'CONNECTION' connection_name
  185. '(' 'TOPIC' topic ( ( ',' connection_option )? ) ')'
  186. ('KEY FORMAT' format_spec 'VALUE FORMAT' format_spec | 'FORMAT' format_spec)
  187. ('INCLUDE'
  188. ( ('KEY' | 'PARTITION' | 'OFFSET' | 'TIMESTAMP' | 'HEADERS' ) ('AS' name)? | 'HEADER' key 'AS' name ('BYTES')? )
  189. (',' ( ('KEY' | 'PARTITION' | 'OFFSET' | 'TIMESTAMP' | 'HEADERS' ) ('AS' name)? | 'HEADER' key 'AS' name ('BYTES')? ) )*
  190. )?
  191. ('ENVELOPE' ('NONE' | 'DEBEZIUM' | 'UPSERT'
  192. ( '(' 'VALUE DECODING ERRORS = INLINE' ('AS' name)? ')' )?
  193. ))?
  194. ('EXPOSE' 'PROGRESS' 'AS' progress_subsource_name)?
  195. with_options?
  196. create_source_load_generator ::=
  197. 'CREATE SOURCE' ('IF NOT EXISTS')? src_name
  198. ('IN CLUSTER' cluster_name)?
  199. 'FROM LOAD GENERATOR' ('AUCTION' | 'CLOCK' | 'COUNTER' | 'MARKETING' | 'TPCH' | 'KEY VALUE')
  200. ('(' (load_generator_option) ( ( ',' load_generator_option ) )* ')')?
  201. 'FOR ALL TABLES'
  202. ('EXPOSE' 'PROGRESS' 'AS' progress_subsource_name)?
  203. with_options?
  204. load_generator_option ::=
  205. 'TICK INTERVAL' interval
  206. | 'AS OF' tick
  207. | 'UP TO' tick
  208. | 'SCALE FACTOR' scale_factor
  209. | 'MAX CARDINALITY' max_cardinality
  210. | 'KEYS' keys
  211. | 'SNAPSHOT ROUNDS' snapshot_rounds
  212. | 'TRANSACTIONAL SNAPSHOT' transactional_snapshot
  213. | 'VALUE SIZE' value_size
  214. | 'SEED' seed
  215. | 'PARTITIONS' partitions
  216. | 'BATCH SIZE' batch_size
  217. create_network_policy::='CREATE' 'NETWORK POLICY' name '(' 'RULES' ( '(' network_policy_rule (',' network_policy_rule)* ')' )? ')'
  218. create_source_postgres ::=
  219. 'CREATE SOURCE' ('IF NOT EXISTS')? src_name
  220. ('IN CLUSTER' cluster_name)?
  221. 'FROM' 'POSTGRES' 'CONNECTION' connection_name
  222. '(' 'PUBLICATION' publication_name ( ( ',' 'TEXT COLUMNS' ('(' (column_name) ( ( ',' column_name ) )* ')')? )? ) ')'
  223. ('FOR ALL TABLES'
  224. | 'FOR TABLES' '(' table_name ('AS' subsrc_name)? (',' table_name ('AS' subsrc_name)? )* ')'
  225. | 'FOR SCHEMAS' '(' schema_name (',' schema_name )* ')'
  226. )
  227. ('EXPOSE' 'PROGRESS' 'AS' progress_subsource_name)?
  228. with_options?
  229. create_source_mysql ::=
  230. 'CREATE SOURCE' ('IF NOT EXISTS')? src_name
  231. ('IN CLUSTER' cluster_name)?
  232. 'FROM' 'MYSQL' 'CONNECTION' connection_name
  233. ( ( '(' 'TEXT COLUMNS' ('(' (column_name) ( ( ',' column_name ) )* ')')? )? )
  234. ( ( ',' 'EXCLUDE COLUMNS' ('(' (column_name) ( ( ',' column_name ) )* ')')? ')' )? )
  235. ('FOR ALL TABLES'
  236. | 'FOR TABLES' '(' table_name ('AS' subsrc_name)? (',' table_name ('AS' subsrc_name)? )* ')'
  237. | 'FOR SCHEMAS' '(' schema_name (',' schema_name )* ')'
  238. )
  239. ('EXPOSE' 'PROGRESS' 'AS' progress_subsource_name)?
  240. with_options?
  241. create_source_sql-server ::=
  242. 'CREATE SOURCE' ('IF NOT EXISTS')? src_name
  243. ('IN CLUSTER' cluster_name)?
  244. 'FROM' 'SQL SERVER' 'CONNECTION' connection_name
  245. ( ( '(' 'TEXT COLUMNS' ( '(' (column_name) ( ( ',' column_name ) )* ')')? )? )
  246. ( ( ',' 'EXCLUDE COLUMNS' ('(' (column_name) ( ( ',' column_name ) )* ')')? ')' )? )
  247. ('FOR ALL TABLES'
  248. | 'FOR TABLES' '(' table_name ('AS' subsrc_name)? (',' table_name ('AS' subsrc_name)? )* ')'
  249. )
  250. ('EXPOSE' 'PROGRESS' 'AS' progress_subsource_name)?
  251. with_options?
  252. create_type ::=
  253. 'CREATE' 'TYPE' type_name 'AS' '(' ((field_name field_type) (',' field_name field_type)*) ')' |
  254. 'CREATE' 'TYPE' type_name 'AS' ( 'LIST' | 'MAP' ) '(' ( property '=' val ) ( ( ',' property '=' val ) )* ')'
  255. create_view ::=
  256. 'CREATE' ('TEMP' | 'TEMPORARY')? 'VIEW' view_name ( '(' col_ident ( ',' col_ident )* ')' )? 'AS' select_stmt |
  257. 'CREATE' ('TEMP' | 'TEMPORARY')? 'VIEW' 'IF NOT EXISTS' view_name ( '(' col_ident ( ',' col_ident )* ')' )? 'AS' select_stmt |
  258. 'CREATE' 'OR REPLACE' 'VIEW' view_name ( '(' col_ident ( ',' col_ident )* ')' )? 'AS' select_stmt
  259. create_table ::=
  260. 'CREATE' ('TEMP' | 'TEMPORARY')? 'TABLE' table_name
  261. '(' ((col_name col_type col_option*) (',' col_name col_type col_option*)*)? ')'
  262. with_options?
  263. deallocate ::=
  264. 'DEALLOCATE' ('PREPARE')? (name | 'ALL')?
  265. declare ::=
  266. 'DECLARE' cursor_name 'CURSOR' ('WITHOUT' 'HOLD')? 'FOR' query
  267. insert ::=
  268. 'INSERT' 'INTO' table_name ('AS'? alias)
  269. ( '(' (col_name) ( ',' col_name )* ')' )?
  270. (
  271. 'VALUES' ( ('(' (expr) ( ( ',' expr ) )* ')') ( ( ',' ('(' (expr) ( ( ',' expr ) )* ')') )* ) )
  272. | query
  273. )
  274. ( 'RETURNING' ( '*' | output_expression ( AS? output_name )? ) ( ',' ( '*' | output_expression ( AS? output_name )? ) )* )?
  275. delete_stmt ::=
  276. 'DELETE FROM' table_name ('AS'? alias)?
  277. 'USING' (from_item) ( ( ',' from_item ) )*
  278. 'WHERE' condition
  279. discard ::=
  280. 'DISCARD' ('TEMP' | 'TEMPORARY' | 'ALL')
  281. drop_connection ::=
  282. 'DROP' 'CONNECTION' ('IF EXISTS')? connection_name ('CASCADE' | 'RESTRICT')?
  283. drop_cluster ::=
  284. 'DROP' 'CLUSTER' ('IF EXISTS')? cluster_name ('CASCADE' | 'RESTRICT')?
  285. drop_cluster_replica ::=
  286. 'DROP' 'CLUSTER' 'REPLICA' ('IF EXISTS')? cluster_name.replica_name
  287. drop_database ::=
  288. 'DROP' 'DATABASE' ('IF EXISTS')? database_name ('CASCADE' | 'RESTRICT')?
  289. drop_materialized_view ::=
  290. 'DROP' 'MATERIALIZED VIEW' 'IF EXISTS'? view_name ('RESTRICT' | 'CASCADE')?
  291. drop_network_policy ::=
  292. 'DROP' 'NETWORK POLICY' 'IF EXISTS'? name
  293. drop_owned ::=
  294. 'DROP' 'OWNED' 'BY' role_name ( ',' role_name )* ('RESTRICT' | 'CASCADE')?
  295. drop_role ::=
  296. 'DROP' 'ROLE' ('IF EXISTS')? role_name
  297. drop_secret ::=
  298. 'DROP' 'SECRET' ('IF EXISTS')? secret_name ('CASCADE' | 'RESTRICT')?
  299. drop_schema ::=
  300. 'DROP' 'SCHEMA' ('IF EXISTS')? schema_name ('CASCADE' | 'RESTRICT')?
  301. drop_sink ::=
  302. 'DROP' 'SINK' ('IF' 'EXISTS')? sink_name
  303. drop_source ::=
  304. 'DROP' 'SOURCE' ('IF' 'EXISTS')? source_name ('RESTRICT' | 'CASCADE')?
  305. drop_table ::=
  306. 'DROP' 'TABLE' ('IF' 'EXISTS')? table_name ('RESTRICT' | 'CASCADE')?
  307. drop_type ::=
  308. 'DROP' 'TYPE' ('IF' 'EXISTS')? data_type_name ('RESTRICT' | 'CASCADE')?
  309. drop_view ::=
  310. 'DROP' 'VIEW' ('IF' 'EXISTS')? view_name ('RESTRICT' | 'CASCADE')?
  311. drop_user ::=
  312. 'DROP' 'USER' ('IF EXISTS')? role_name
  313. execute ::=
  314. 'EXECUTE' name ('(' (parameter_value) ( ',' parameter_value )* ')')?
  315. explain_filter_pushdown ::=
  316. 'EXPLAIN FILTER PUSHDOWN'
  317. 'FOR'
  318. (
  319. select_stmt |
  320. 'MATERIALIZED VIEW' name
  321. )
  322. explain_timestamp ::=
  323. 'EXPLAIN' 'TIMESTAMP'
  324. ( 'AS' ( 'TEXT' | 'JSON' ) )?
  325. 'FOR'
  326. select_stmt
  327. explain_schema ::=
  328. 'EXPLAIN' ( 'KEY' | 'VALUE' ) 'SCHEMA'
  329. ( 'AS JSON' )?
  330. 'FOR'
  331. 'CREATE SINK' (sink_name)?
  332. sink_definition
  333. fetch ::=
  334. 'FETCH' 'FORWARD'? ('ALL' | count)? 'FROM'? cursor_name
  335. ( 'WITH'? '(' (option_name ('=' option_value)?) ( ',' (option_name ('=' option_value)?) )* ')' )?
  336. format_spec ::=
  337. 'AVRO USING' 'CONFLUENT SCHEMA REGISTRY' 'CONNECTION' connection_name key_strat? val_strat? with_options? |
  338. 'PROTOBUF' ('USING' 'CONFLUENT SCHEMA REGISTRY' 'CONNECTION' connection_name with_options | 'MESSAGE' message_name 'USING SCHEMA' encoded_schema) |
  339. 'REGEX' regex |
  340. 'CSV WITH' ('HEADER' ( '(' col_name (',' col_name)* ')' ) | n 'COLUMNS') ('DELIMITED BY' char)? |
  341. 'TEXT' |
  342. 'BYTES' |
  343. 'JSON'
  344. grant_privilege ::=
  345. 'GRANT' ((privilege (',' privilege)*) | 'ALL' 'PRIVILEGES'? ) 'ON' ( ('TABLE'? | 'TYPE' | 'SECRET' | 'CONNECTION' | 'DATABASE' | 'SCHEMA' | 'CLUSTER') object_name (',' object_name)* | 'SYSTEM' | 'ALL' ('TABLES' | 'TYPES' | 'SECRETS' | 'CONNECTIONS') 'IN' 'SCHEMA' schema_name (',' schema_name)* | 'ALL' ('TABLES' | 'TYPES' | 'SECRETS' | 'CONNECTIONS' | 'SCHEMAS') 'IN' 'DATABASE' database_name (',' database_name)* | 'ALL' ('TABLES' | 'TYPES' | 'SECRETS' | 'CONNECTIONS' | 'DATABASES' | 'SCHEMAS' | 'CLUSTERS') ) 'TO' 'GROUP'? role_name ( ',' 'GROUP'? role_name )*
  346. grant_role ::=
  347. 'GRANT' role_name ( ',' role_name )* 'TO' 'GROUP'? member_name ( ',' 'GROUP'? member_name )*
  348. key_strat ::=
  349. 'KEY STRATEGY' strat
  350. val_strat ::=
  351. 'VALUE STRATEGY' strat
  352. strat ::=
  353. 'INLINE' avro_reader_schema |
  354. 'ID' schema_registry_id |
  355. 'LATEST'
  356. sink_format_spec ::=
  357. 'AVRO USING' csr_connection |
  358. 'JSON' | 'TEXT' | 'BYTES'
  359. compression ::= 'COMPRESSION' ('NONE' | 'GZIP')
  360. func_at_time_zone ::=
  361. 'SELECT' ( 'TIMESTAMP' | 'TIMESTAMPTZ' ) ('timestamp' | 'timestamptz') 'AT TIME ZONE' 'zone::type'
  362. func_cast ::=
  363. 'CAST' '(' val 'AS' type ')'
  364. func_coalesce ::=
  365. 'coalesce' '(' val ( ',' val )* ')'
  366. func_csv_extract ::=
  367. 'csv_extract' '(' num_csv_col ',' col_name ')'
  368. func_date_bin ::=
  369. 'date_bin' '(' stride ',' source ',' origin ')'
  370. func_date_bin_experimental ::=
  371. 'date_bin' '(' stride ',' source (',' origin)? ')'
  372. func_date_bin_hopping ::=
  373. 'date_bin_hopping' '(' hop ',' width ',' source (',' origin)? ')'
  374. func_date_trunc ::=
  375. 'date_trunc' '(' "'" ( 'microseconds' | 'milliseconds' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year' | 'decade' | 'century' | 'millenium' ) "'" ',' val ')'
  376. func_extract ::=
  377. 'EXTRACT' '(' ( 'EPOCH' | 'MILLENNIUM' | 'CENTURY' | 'DECADE' | 'YEAR' | 'QUARTER' | 'MONTH' | 'WEEK' | 'DAY' | 'HOUR' | 'MINUTE' | 'SECOND' | 'MICROSECOND' | 'MILLISECOND' | 'DOW' | 'ISODOW' | 'DOY' ) 'FROM' val ')'
  378. func_date_part ::=
  379. 'date_part' '(' "'" ( 'epoch' | 'millennium' | 'century' | 'decade' | 'year' | 'quarter' | 'month' | 'week' | 'dat' | 'hour' | 'minute' | 'second' | 'microsecond' | 'millisecond' | 'dow' | 'isodow' | 'doy' ) "'" ',' val ')'
  380. func_length ::=
  381. 'length' '(' str (',' encoding_name)? ')'
  382. func_map_agg ::=
  383. 'map_agg' '(' keys ',' values ( 'ORDER' 'BY' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? ( ',' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? )* )? ')' ('FILTER' '(' 'WHERE' filter_clause ')')?
  384. func_timezone ::=
  385. 'TIMEZONE' '(' zone'::'type ',' ( 'timestamp' | 'timestamptz' ) ')'
  386. func_justify_days ::=
  387. 'justify_days' '(' interval ')'
  388. func_justify_hours ::=
  389. 'justify_hours' '(' interval ')'
  390. func_justify_interval ::=
  391. 'justify_interval' '(' interval ')'
  392. join_expr ::=
  393. select_pred ('CROSS' | 'NATURAL' join_type?) 'JOIN' table_ref select_post
  394. | select_pred join_type 'JOIN' table_ref ( 'USING' '(' ( ( col_ref ) ( ( ',' col_ref ) )* ) ('AS' join_using_alias)? ')' | 'ON' expression ) select_post
  395. join_type ::=
  396. ( 'FULL' ( 'OUTER' | ) | 'LEFT' ( 'OUTER' | ) | 'RIGHT' ( 'OUTER' | ) | 'INNER' | )
  397. jsonb_agg ::=
  398. 'jsonb_agg' '(' expression ( 'ORDER' 'BY' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? ( ',' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? )* )? ')' ('FILTER' '(' 'WHERE' filter_clause ')')?
  399. jsonb_object_agg ::=
  400. 'jsonb_object_agg' '(' keys ',' values ( 'ORDER' 'BY' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? ( ',' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? )* )? ')' ('FILTER' '(' 'WHERE' filter_clause ')')?
  401. kafka_sink_connection ::=
  402. 'KAFKA' 'CONNECTION' connection_name
  403. '(' 'TOPIC' topic ( ( ',' connection_option )? ) ')'
  404. csr_connection ::=
  405. 'CONFLUENT SCHEMA REGISTRY' 'CONNECTION' connection_name '(' ( ',' connection_option )? ')'
  406. list_agg ::=
  407. 'list_agg' '(' value ( 'ORDER' 'BY' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? ( ',' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? )* )? ')' ('FILTER' '(' 'WHERE' filter_clause ')')?
  408. lit_cast ::=
  409. type val
  410. op_cast ::=
  411. val '::' type
  412. prepare ::=
  413. 'PREPARE' name 'AS' statement
  414. privilege ::=
  415. ('SELECT' | 'INSERT' | 'UPDATE' | 'DELETE' | 'CREATE' | 'USAGE' | 'CREATEROLE' | 'CREATEDB' | 'CREATECLUSTER' | 'CREATENETWORKPOLICY')
  416. reassign_owned ::=
  417. 'REASSIGN' 'OWNED' 'BY' old_role (',' old_role)* 'TO' new_role
  418. reset_stmt ::=
  419. 'RESET' parameter_name
  420. revoke_privilege ::=
  421. 'REVOKE' ((privilege (',' privilege)*) | 'ALL' 'PRIVILEGES'? ) 'ON' ( ('TABLE'? | 'TYPE' | 'SECRET' | 'CONNECTION' | 'DATABASE' | 'SCHEMA' | 'CLUSTER') object_name (',' object_name)* | 'SYSTEM' | 'ALL' ('TABLES' | 'TYPES' | 'SECRETS' | 'CONNECTIONS') 'IN' 'SCHEMA' schema_name (',' schema_name)* | 'ALL' ('TABLES' | 'TYPES' | 'SECRETS' | 'CONNECTIONS' | 'SCHEMAS') 'IN' 'DATABASE' database_name (',' database_name)* | 'ALL' ('TABLES' | 'TYPES' | 'SECRETS' | 'CONNECTIONS' | 'DATABASES' | 'SCHEMAS' | 'CLUSTERS') ) 'FROM' 'GROUP'? role_name ( ',' 'GROUP'? role_name )*
  422. revoke_role ::=
  423. 'REVOKE' role_name ( ',' role_name )* 'FROM' 'GROUP'? member_name ( ',' 'GROUP'? member_name )*
  424. select_stmt ::=
  425. ( select_with_ctes | select_with_recursive_ctes | simple_select_stmt )
  426. simple_select_stmt ::=
  427. 'SELECT'
  428. ( 'ALL' | 'DISTINCT' ( 'ON' '(' col_ref ( ',' col_ref )* ')' )? )?
  429. target_elem ( ',' target_elem )*
  430. 'FROM' table_expr ( ',' table_expr )* join_expr?
  431. ( 'WHERE' expr )?
  432. ( 'GROUP' 'BY' col_ref ( ',' col_ref )* )?
  433. ( 'OPTIONS' '(' ( option '=' val ) ( ( ',' option '=' val ) )* ')' )?
  434. ( 'HAVING' expr )?
  435. ( 'ORDER' 'BY' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? ( ',' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? )* )?
  436. ( 'LIMIT' expr )?
  437. ( 'OFFSET' integer )?
  438. ( ( 'UNION' | 'INTERSECT' | 'EXCEPT' ) ( 'ALL' | 'DISTINCT' )? another_select_stmt )?
  439. set_stmt ::=
  440. 'SET' ( 'SESSION' | 'LOCAL' )? name ( 'TO' | '=' ) ( value | 'DEFAULT' )
  441. set_transaction_isolation ::=
  442. 'SET' 'TRANSACTION_ISOLATION' ( 'TO' | '=' ) isolation_level
  443. string_agg ::=
  444. 'string_agg' '(' value ',' delimiter ( 'ORDER' 'BY' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? ( ',' col_ref ( 'ASC' | 'DESC' )? ( 'NULLS LAST' | 'NULLS FIRST' )? )* )? ')' ('FILTER' '(' 'WHERE' filter_clause ')')?
  445. table_ref ::=
  446. (
  447. table_name
  448. | 'LATERAL'? '(' select_stmt ')'
  449. | 'LATERAL'? table_func_call
  450. | '(' join_expr ')'
  451. ) ('AS'? table_alias ('(' col_alias (',' col_alias)* ')'))?
  452. time_unit ::=
  453. 'MILLENNIUM' | 'CENTURY' | 'DECADE' | 'YEAR' | 'MONTH' | 'DAY' | 'HOUR' | 'MINUTE' | 'SECOND' | 'MILLISECONDS' | 'MICROSECONDS'
  454. type_bool ::=
  455. ( 'TRUE' | 'FALSE' )
  456. type_date ::=
  457. 'DATE' "'" date_str ('T'? time_str)? ( ('+' | '-' ) tz_offset )? "'"
  458. type_float ::=
  459. int ( '.' frac )?
  460. type_interval_time_expr ::=
  461. ('+' | '-')? (ym_str | time_str | (int ('.' frac)? time_unit?))
  462. type_interval_val ::=
  463. 'INTERVAL' "'" time_expr+ "'" ( ( head_time_unit 'TO' )? tail_time_unit )?
  464. type_jsonb ::=
  465. "'" json_string "'" '::JSONB'
  466. type_map ::=
  467. "'" map_string "'" '::' 'MAP' '[' 'TEXT' '=>' value_type ']'
  468. type_list ::=
  469. 'LIST' '[' (element (',' element)*)? ']'
  470. | 'LIST' '(' query ')'
  471. type_numeric_dec ::=
  472. 'numeric' ( '(' precision ',' scale ')' )?
  473. type_numeric_val ::=
  474. int ( '.' frac )? ( ( 'e' | 'E' ) '-'? exp )?
  475. type_record ::=
  476. 'ROW' '(' expr? (',' expr)* ')'
  477. type_text ::=
  478. "'" text "'"
  479. type_bytea_esc ::=
  480. "'" "\" "binary string" "'"
  481. type_bytea_hex ::=
  482. "'" "\x" "binary string" "'"
  483. type_uuid ::=
  484. UUID "'" uuid_str "'"
  485. type_escape_text ::=
  486. ('e' | 'E') "'" escapable_text "'"
  487. type_time ::=
  488. 'TIME' "'" time_str "'"
  489. type_timestamp ::=
  490. (
  491. 'TIMESTAMP' ('(' precision ')')? (('WITH' | 'WITHOUT') TIME ZONE)?
  492. |
  493. 'TIMESTAMPTZ' ('(' precision ')')?
  494. )
  495. "'" date_str
  496. ( (' ' | 'T') time_str)? ( ('+' | '-' ) tz_offset )?
  497. "'"
  498. with_ctes ::=
  499. 'WITH'
  500. cte_binding ( ',' cte_binding )*
  501. select_stmt
  502. with_recursive_ctes ::=
  503. 'WITH MUTUALLY RECURSIVE'
  504. ( '(' ('RETURN AT' | 'ERROR AT')? 'RECURSION LIMIT' limit ')' )?
  505. recursive_cte_binding ( ',' recursive_cte_binding )*
  506. select_stmt
  507. cte_binding ::=
  508. cte_ident ( '(' col_ident ( ',' col_ident )* ')' )? 'AS' '(' select_stmt ')'
  509. recursive_cte_binding ::=
  510. cte_ident '(' col_ident col_type ( ',' col_ident col_type )* ')' 'AS' '(' select_stmt ')'
  511. with_options ::=
  512. ('WITH' '(' ( field '='? val ) ( ( ',' field '='? val ) )* ')')?
  513. with_options_aws ::= 'WITH' '('
  514. (
  515. static_credentials
  516. | 'profile_name' '=' val
  517. | 'role_arn' '=' val
  518. | 'region' '=' val
  519. )
  520. (
  521. static_credentials
  522. | 'profile_name' '=' val
  523. | 'role_arn' '=' val
  524. | 'region' '=' val
  525. )*
  526. ')'
  527. with_options_aws_static ::=
  528. 'access_key_id' '=' val ',' 'secret_access_key' '=' val ( ',' 'token' '=' val )?
  529. with_options_retain_history ::= ('WITH' '(' ('RETAIN HISTORY' '='? 'FOR' retention_period) ')')
  530. network_policy_rule::= name ( '(' rule_option (',' rule_option)* ')' )?