Grammar Diagrams

abort

abort ::= ABORT [ TRANSACTION | WORK ]

ABORTTRANSACTIONWORK

alter_database

alter_database ::= ALTER DATABASE name 
                   [ [ WITH ] alter_database_option [ ... ]
                     | RENAME TO name
                     | OWNER TO { new_owner
                                  | CURRENT_USER
                                  | SESSION_USER }
                     | SET run_time_parameter { TO | = } 
                       { value | DEFAULT }
                     | SET run_time_parameter FROM CURRENT
                     | RESET run_time_parameter
                     | RESET ALL ]

ALTERDATABASEnameWITHalter_database_optionRENAMETOnameOWNERTOnew_ownerCURRENT_USERSESSION_USERSETrun_time_parameterTO=valueDEFAULTSETrun_time_parameterFROMCURRENTRESETrun_time_parameterRESETALL

alter_database_option

alter_database_option ::= ALLOW_CONNECTIONS allowconn
                          | CONNECTION LIMIT connlimit
                          | IS_TEMPLATE istemplate

ALLOW_CONNECTIONSallowconnCONNECTIONLIMITconnlimitIS_TEMPLATEistemplate

allowconn

allowconn ::= TRUE | FALSE

TRUEFALSE

istemplate

istemplate ::= TRUE | FALSE

TRUEFALSE

connlimit

connlimit ::= int_literal

int_literal

alter_default_priv

alter_default_priv ::= ALTER DEFAULT PRIVILEGES 
                       [ FOR { ROLE | USER } role_name [ , ... ] ]  
                       [ IN SCHEMA schema_name [ , ... ] ] 
                       abbr_grant_or_revoke

ALTERDEFAULTPRIVILEGESFORROLEUSER,role_nameINSCHEMA,schema_nameabbr_grant_or_revoke

abbr_grant_or_revoke

abbr_grant_or_revoke ::= a_grant_table
                         | a_grant_seq
                         | a_grant_func
                         | a_grant_type
                         | a_grant_schema
                         | a_revoke_table
                         | a_revoke_seq
                         | a_revoke_func
                         | a_revoke_type
                         | a_revoke_schema

a_grant_tablea_grant_seqa_grant_funca_grant_typea_grant_schemaa_revoke_tablea_revoke_seqa_revoke_funca_revoke_typea_revoke_schema

a_grant_table

a_grant_table ::= GRANT { grant_table_priv [ , ... ]
                          | ALL [ PRIVILEGES ] } ON TABLES TO 
                  grantee_role [ , ... ]  [ WITH GRANT OPTION ]

GRANT,grant_table_privALLPRIVILEGESONTABLESTO,grantee_roleWITHGRANTOPTION

grant_table_priv

grant_table_priv ::= SELECT
                     | INSERT
                     | UPDATE
                     | DELETE
                     | TRUNCATE
                     | REFERENCES
                     | TRIGGER

SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGER

a_grant_seq

a_grant_seq ::= GRANT { grant_seq_priv [ , ... ]
                        | ALL [ PRIVILEGES ] } ON SEQUENCES TO 
                grantee_role [ , ... ]  [ WITH GRANT OPTION ]

GRANT,grant_seq_privALLPRIVILEGESONSEQUENCESTO,grantee_roleWITHGRANTOPTION

grant_seq_priv

grant_seq_priv ::= USAGE | SELECT | UPDATE

USAGESELECTUPDATE

a_grant_func

a_grant_func ::= GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON 
                 { FUNCTIONS | ROUTINES } TO grantee_role [ , ... ]  
                 [ WITH GRANT OPTION ]

GRANTEXECUTEALLPRIVILEGESONFUNCTIONSROUTINESTO,grantee_roleWITHGRANTOPTION

a_grant_type

a_grant_type ::= GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPES TO 
                 grantee_role [ , ... ]  [ WITH GRANT OPTION ]

GRANTUSAGEALLPRIVILEGESONTYPESTO,grantee_roleWITHGRANTOPTION

a_grant_schema

a_grant_schema ::= GRANT { USAGE | CREATE | ALL [ PRIVILEGES ] } ON 
                   SCHEMAS TO grantee_role [ , ... ]  
                   [ WITH GRANT OPTION ]

GRANTUSAGECREATEALLPRIVILEGESONSCHEMASTO,grantee_roleWITHGRANTOPTION

a_revoke_table

a_revoke_table ::= REVOKE [ GRANT OPTION FOR ] 
                   { grant_table_priv [ , ... ] | ALL [ PRIVILEGES ] } 
                   ON TABLES  FROM grantee_role [ , ... ] 
                   [ CASCADE | RESTRICT ]

REVOKEGRANTOPTIONFOR,grant_table_privALLPRIVILEGESONTABLESFROM,grantee_roleCASCADERESTRICT

a_revoke_seq

a_revoke_seq ::= REVOKE [ GRANT OPTION FOR ] 
                 { grant_seq_priv [ , ... ] | ALL [ PRIVILEGES ] } ON 
                 SEQUENCES  FROM grantee_role [ , ... ] 
                 [ CASCADE | RESTRICT ]

REVOKEGRANTOPTIONFOR,grant_seq_privALLPRIVILEGESONSEQUENCESFROM,grantee_roleCASCADERESTRICT

a_revoke_func

a_revoke_func ::= REVOKE [ GRANT OPTION FOR ] 
                  { EXECUTE | ALL [ PRIVILEGES ] } ON 
                  { FUNCTIONS | ROUTINES }  FROM grantee_role 
                  [ , ... ] [ CASCADE | RESTRICT ]

REVOKEGRANTOPTIONFOREXECUTEALLPRIVILEGESONFUNCTIONSROUTINESFROM,grantee_roleCASCADERESTRICT

a_revoke_type

a_revoke_type ::= REVOKE [ GRANT OPTION FOR ] 
                  { USAGE | ALL [ PRIVILEGES ] } ON TYPES  FROM 
                  grantee_role [ , ... ] [ CASCADE | RESTRICT ]

REVOKEGRANTOPTIONFORUSAGEALLPRIVILEGESONTYPESFROM,grantee_roleCASCADERESTRICT

a_revoke_schema

a_revoke_schema ::= REVOKE [ GRANT OPTION FOR ] 
                    { USAGE | CREATE | ALL [ PRIVILEGES ] } ON SCHEMAS 
                     FROM grantee_role [ , ... ] 
                    [ CASCADE | RESTRICT ]

REVOKEGRANTOPTIONFORUSAGECREATEALLPRIVILEGESONSCHEMASFROM,grantee_roleCASCADERESTRICT

alter_domain_default

alter_domain_default ::= ALTER DOMAIN name 
                         { SET DEFAULT expression | DROP DEFAULT }

ALTERDOMAINnameSETDEFAULTexpressionDROPDEFAULT

alter_domain_rename

alter_domain_rename ::= ALTER DOMAIN name RENAME TO name

ALTERDOMAINnameRENAMETOname

alter_function

alter_function ::= ALTER FUNCTION subprogram_name ( 
                   [ subprogram_signature ] )  
                   { special_fn_and_proc_attribute
                     | { alterable_fn_and_proc_attribute
                         | alterable_fn_only_attribute } [ ... ] 
                       [ RESTRICT ] }

ALTERFUNCTIONsubprogram_name(subprogram_signature)special_fn_and_proc_attributealterable_fn_and_proc_attributealterable_fn_only_attributeRESTRICT

special_fn_and_proc_attribute

special_fn_and_proc_attribute ::= RENAME TO subprogram_name
                                  | OWNER TO 
                                    { role_name
                                      | CURRENT_ROLE
                                      | CURRENT_USER
                                      | SESSION_USER }
                                  | SET SCHEMA schema_name
                                  | [ NO ] DEPENDS ON EXTENSION 
                                    extension_name

RENAMETOsubprogram_nameOWNERTOrole_nameCURRENT_ROLECURRENT_USERSESSION_USERSETSCHEMAschema_nameNODEPENDSONEXTENSIONextension_name

alter_foreign_data_wrapper

alter_foreign_data_wrapper ::= ALTER FOREIGN DATA WRAPPER fdw_name  
                               [ HANDLER handler_name | NO HANDLER ]  
                               [ VALIDATOR validator_name
                                 | NO VALIDATOR ]  
                               [ OPTIONS ( alter_fdw_options ) ]  
                               [ OWNER TO new_owner ]  
                               [ RENAME TO new_name ]

ALTERFOREIGNDATAWRAPPERfdw_nameHANDLERhandler_nameNOHANDLERVALIDATORvalidator_nameNOVALIDATOROPTIONS(alter_fdw_options)OWNERTOnew_ownerRENAMETOnew_name

alter_foreign_table

alter_foreign_table ::= ALTER FOREIGN TABLE [ IF EXISTS ] table_name 
                        alter_foreign_table_action [ , ... ]

ALTERFOREIGNTABLEIFEXISTStable_name,alter_foreign_table_action

alter_foreign_table_action

alter_foreign_table_action ::= ADD [ COLUMN ] column_name data_type 
                               [ COLLATE collation ] 
                               [ alter_column_constraint [ ... ] ]
                               | RENAME TO table_name
                               | DROP [ COLUMN ] column_name 
                                 [ RESTRICT | CASCADE ]
                               | OWNER TO new_owner
                               | OPTIONS ( alter_fdw_options )

ADDCOLUMNcolumn_namedata_typeCOLLATEcollationalter_column_constraintRENAMETOtable_nameDROPCOLUMNcolumn_nameRESTRICTCASCADEOWNERTOnew_ownerOPTIONS(alter_fdw_options)

alter_group

alter_group ::= ALTER GROUP role_specification { ADD | DROP } USER 
                role_name [ , ... ]

ALTERGROUProle_specificationADDDROPUSER,role_name

alter_group_rename

alter_group_rename ::= ALTER GROUP role_name RENAME TO new_role_name

ALTERGROUProle_nameRENAMETOnew_role_name

alter_policy

alter_policy ::= ALTER POLICY name ON table_name 
                 [ TO { role_name
                        | PUBLIC
                        | CURRENT_USER
                        | SESSION_USER } [ , ... ] ]  
                 [ USING ( using_expression ) ] 
                 [ WITH CHECK ( check_expression ) ]

ALTERPOLICYnameONtable_nameTO,role_namePUBLICCURRENT_USERSESSION_USERUSING(using_expression)WITHCHECK(check_expression)

alter_policy_rename

alter_policy_rename ::= ALTER POLICY name ON table_name RENAME TO 
                        new_name

ALTERPOLICYnameONtable_nameRENAMETOnew_name

alter_procedure

alter_procedure ::= ALTER PROCEDURE subprogram_name ( 
                    [ subprogram_signature ] )  
                    { special_fn_and_proc_attribute
                      | alterable_fn_and_proc_attribute [ ... ] 
                        [ RESTRICT ] }

ALTERPROCEDUREsubprogram_name(subprogram_signature)special_fn_and_proc_attributealterable_fn_and_proc_attributeRESTRICT

alter_role

alter_role ::= ALTER ROLE role_specification 
               [ [ WITH ] alter_role_option [ , ... ] ]

ALTERROLErole_specificationWITH,alter_role_option

alter_role_option

alter_role_option ::= SUPERUSER
                      | NOSUPERUSER
                      | CREATEDB
                      | NOCREATEDB
                      | CREATEROLE
                      | NOCREATEROLE
                      | INHERIT
                      | NOINHERIT
                      | LOGIN
                      | NOLOGIN
                      | CONNECTION LIMIT connlimit
                      | [ ENCRYPTED ] PASSWORD  ' password ' 
                      | PASSWORD NULL
                      | VALID UNTIL  ' timestamp ' 

SUPERUSERNOSUPERUSERCREATEDBNOCREATEDBCREATEROLENOCREATEROLEINHERITNOINHERITLOGINNOLOGINCONNECTIONLIMITconnlimitENCRYPTEDPASSWORD password PASSWORDNULLVALIDUNTIL timestamp

role_specification

role_specification ::= role_name | CURRENT_USER | SESSION_USER

role_nameCURRENT_USERSESSION_USER

alter_role_rename

alter_role_rename ::= ALTER ROLE role_name RENAME TO new_role_name

ALTERROLErole_nameRENAMETOnew_role_name

new_role_name

new_role_name ::= name

name

alter_role_config

alter_role_config ::= ALTER ROLE { role_specification | ALL } 
                      [ IN DATABASE database_name ] config_setting

ALTERROLErole_specificationALLINDATABASEdatabase_nameconfig_setting

config_setting

config_setting ::= SET config_param { TO | = } 
                   { config_value | DEFAULT }
                   | SET config_param FROM CURRENT
                   | RESET config_param
                   | RESET ALL

SETconfig_paramTO=config_valueDEFAULTSETconfig_paramFROMCURRENTRESETconfig_paramRESETALL

config_param

config_param ::= text_literal

text_literal

config_value

config_value ::= text_literal

text_literal

alter_sequence

alter_sequence ::= ALTER SEQUENCE [ IF EXISTS ] sequence_name 
                   alter_sequence_options

ALTERSEQUENCEIFEXISTSsequence_namealter_sequence_options

alter_sequence_options

alter_sequence_options ::= [ AS seq_data_type ]  
                           [ INCREMENT [ BY ] int_literal ]  
                           [ MINVALUE int_literal | NO MINVALUE ]  
                           [ MAXVALUE int_literal | NO MAXVALUE ]  
                           [ START [ WITH ] int_literal ]  
                           [ RESTART [ [ WITH ] int_literal ] ]  
                           [ CACHE int_literal ]  [ [ NO ] CYCLE ]  
                           [ OWNED BY table_name . column_name
                             | NONE ]

ASseq_data_typeINCREMENTBYint_literalMINVALUEint_literalNOMINVALUEMAXVALUEint_literalNOMAXVALUESTARTWITHint_literalRESTARTWITHint_literalCACHEint_literalNOCYCLEOWNED BYtable_name.column_nameNONE

seq_data_type

seq_data_type ::= 'smallint' | 'integer' | 'bigint'

smallintintegerbigint

alter_server

alter_server ::= ALTER SERVER server_name [ VERSION server_version ]  
                 [ OPTIONS ( alter_fdw_options ) ] 
                 [ OWNER TO new_owner ]

ALTERSERVERserver_nameVERSIONserver_versionOPTIONS(alter_fdw_options)OWNERTOnew_owner

server_name

server_name ::= name

name

server_version

server_version ::= name

name

alter_table

alter_table ::= ALTER TABLE [ IF EXISTS ] table_expr 
                alter_table_action [ , ... ]

ALTERTABLEIFEXISTStable_expr,alter_table_action

alter_table_action

alter_table_action ::= ADD [ COLUMN ] [ IF NOT EXISTS ] column_name 
                       data_type [ alter_column_constraint [ ... ] ]
                       | RENAME TO table_name
                       | DROP [ COLUMN ] [ IF EXISTS ] column_name 
                         [ RESTRICT | CASCADE ]
                       | ALTER [ COLUMN ] column_name [ SET DATA ] 
                         TYPE data_type [ COLLATE collation ] 
                         [ USING expression ]
                       | ADD alter_table_constraint
                       | DROP CONSTRAINT constraint_name 
                         [ RESTRICT | CASCADE ]
                       | RENAME [ COLUMN ] column_name TO column_name
                       | RENAME CONSTRAINT constraint_name TO 
                         constraint_name
                       | DISABLE ROW LEVEL SECURITY
                       | ENABLE ROW LEVEL SECURITY
                       | FORCE ROW LEVEL SECURITY
                       | SET TABLESPACE tablespace_name
                       | NO FORCE ROW LEVEL SECURITY

ADDCOLUMNIFNOTEXISTScolumn_namedata_typealter_column_constraintRENAMETOtable_nameDROPCOLUMNIFEXISTScolumn_nameRESTRICTCASCADEALTERCOLUMNcolumn_nameSET DATATYPEdata_typeCOLLATEcollationUSINGexpressionADDalter_table_constraintDROPCONSTRAINTconstraint_nameRESTRICTCASCADERENAMECOLUMNcolumn_nameTOcolumn_nameRENAMECONSTRAINTconstraint_nameTOconstraint_nameDISABLEROWLEVELSECURITYENABLEROWLEVELSECURITYFORCEROWLEVELSECURITYSETTABLESPACEtablespace_nameNOFORCEROWLEVELSECURITY

alter_table_constraint

alter_table_constraint ::= [ CONSTRAINT constraint_name ]  
                           { CHECK ( expression )
                             | UNIQUE ( column_names ) 
                               index_parameters
                             | FOREIGN KEY ( column_names ) 
                               references_clause }  
                           [ DEFERRABLE | NOT DEFERRABLE ] 
                           [ INITIALLY DEFERRED
                             | INITIALLY IMMEDIATE ]

CONSTRAINTconstraint_nameCHECK(expression)UNIQUE(column_names)index_parametersFOREIGNKEY(column_names)references_clauseDEFERRABLENOTDEFERRABLEINITIALLYDEFERREDINITIALLYIMMEDIATE

alter_column_constraint

alter_column_constraint ::= [ CONSTRAINT constraint_name ]  
                            { NOT NULL
                              | NULL
                              | CHECK ( expression )
                              | DEFAULT expression
                              | UNIQUE index_parameters
                              | references_clause } 
                            [ DEFERRABLE | NOT DEFERRABLE ] 
                            [ INITIALLY DEFERRED
                              | INITIALLY IMMEDIATE ]

CONSTRAINTconstraint_nameNOTNULLNULLCHECK(expression)DEFAULTexpressionUNIQUEindex_parametersreferences_clauseDEFERRABLENOTDEFERRABLEINITIALLYDEFERREDINITIALLYIMMEDIATE

alter_index

alter_index ::= ALTER INDEX [ IF EXISTS ] index_name 
                alter_index_action [ , ... ]

ALTERINDEXIFEXISTSindex_name,alter_index_action

alter_index_action

alter_index_action ::= RENAME TO new_name
                       | ALTER [ COLUMN ] column_number SET STATISTICS 
                         integer
                       | SET TABLESPACE tablespace_name

RENAMETOnew_nameALTERCOLUMNcolumn_numberSET STATISTICSintegerSETTABLESPACEtablespace_name

alter_materialized_view

alter_materialized_view ::= ALTER MATERIALIZED VIEW [ IF EXISTS ] 
                            matview_name 
                            alter_materialized_view_action [ , ... ]

ALTERMATERIALIZEDVIEWIFEXISTSmatview_name,alter_materialized_view_action

alter_materialized_view_action

alter_materialized_view_action ::= RENAME TO new_name
                                   | SET TABLESPACE tablespace_name

RENAMETOnew_nameSETTABLESPACEtablespace_name

alter_schema

alter_schema ::= ALTER SCHEMA schema_name 
                 { RENAME TO new_name
                   | OWNER TO { new_owner
                                | CURRENT_USER
                                | SESSION_USER } }

ALTERSCHEMAschema_nameRENAMETOnew_nameOWNERTOnew_ownerCURRENT_USERSESSION_USER

alter_user

alter_user ::= ALTER USER role_specification 
               [ [ WITH ] alter_role_option [ , ... ] ]

ALTERUSERrole_specificationWITH,alter_role_option

alter_user_rename

alter_user_rename ::= ALTER USER role_name RENAME TO new_role_name

ALTERUSERrole_nameRENAMETOnew_role_name

alter_user_config

alter_user_config ::= ALTER USER { role_specification | ALL } 
                      [ IN DATABASE database_name ] config_setting

ALTERUSERrole_specificationALLINDATABASEdatabase_nameconfig_setting

analyze

analyze ::= ANALYZE [ VERBOSE ] [ table_and_columns [ , ... ] ]

ANALYZEVERBOSE,table_and_columns

table_and_columns

table_and_columns ::= table_name [ ( column_name [ , ... ] ) ]

table_name(,column_name)

begin

begin ::= BEGIN [ TRANSACTION | WORK ] [ transaction_mode [ ... ] ]

BEGINTRANSACTIONWORKtransaction_mode

call_procedure

call_procedure ::= CALL subprogram_name ( [ actual_arg [ , ... ] ] )

CALLsubprogram_name(,actual_arg)

actual_arg

actual_arg ::= [ formal_arg => ] expression

formal_arg=>expression

comment_on

comment_on ::= COMMENT ON 
               { ACCESS METHOD access_method_name
                 | AGGREGATE aggregate_name ( aggregate_signature )
                 | CAST ( source_type AS target_type )
                 | COLLATION object_name
                 | COLUMN relation_name . column_name
                 | CONSTRAINT constraint_name ON table_name
                 | CONSTRAINT constraint_name ON DOMAIN domain_name
                 | CONVERSION object_name
                 | DATABASE object_name
                 | DOMAIN object_name
                 | EXTENSION object_name
                 | EVENT TRIGGER object_name
                 | FOREIGN DATA WRAPPER object_name
                 | FOREIGN TABLE object_name
                 | FUNCTION subprogram_name ( [ subprogram_signature ] 
                   ) | INDEX object_name
                 | LARGE OBJECT large_object_oid
                 | MATERIALIZED VIEW object_name
                 | OPERATOR operator_name ( operator_signature )
                 | OPERATOR CLASS object_name USING index_method
                 | OPERATOR FAMILY object_name USING index_method
                 | POLICY policy_name ON table_name
                 | [ PROCEDURAL ] LANGUAGE object_name
                 | PROCEDURE subprogram_name ( 
                   [ subprogram_signature ] )
                 | PUBLICATION object_name
                 | ROLE object_name
                 | ROUTINE subprogram_name ( [ subprogram_signature ] 
                   ) | RULE rule_name ON table_name
                 | SCHEMA object_name
                 | SEQUENCE object_name
                 | SERVER object_name
                 | STATISTICS object_name
                 | SUBSCRIPTION object_name
                 | TABLE object_name
                 | TABLESPACE object_name
                 | TEXT SEARCH CONFIGURATION object_name
                 | TEXT SEARCH DICTIONARY object_name
                 | TEXT SEARCH PARSER object_name
                 | TEXT SEARCH TEMPLATE object_name
                 | TRIGGER trigger_name ON table_name
                 | TYPE object_name
                 | VIEW object_name } IS { text_literal | NULL }

COMMENTONACCESSMETHODaccess_method_nameAGGREGATEaggregate_name(aggregate_signature)CAST(source_typeAStarget_type)COLLATIONobject_nameCOLUMNrelation_name.column_nameCONSTRAINTconstraint_nameONtable_nameCONSTRAINTconstraint_nameONDOMAINdomain_nameCONVERSIONobject_nameDATABASEobject_nameDOMAINobject_nameEXTENSIONobject_nameEVENTTRIGGERobject_nameFOREIGNDATAWRAPPERobject_nameFOREIGNTABLEobject_nameFUNCTIONsubprogram_name(subprogram_signature)INDEXobject_nameLARGEOBJECTlarge_object_oidMATERIALIZEDVIEWobject_nameOPERATORoperator_name(operator_signature)OPERATORCLASSobject_nameUSINGindex_methodOPERATORFAMILYobject_nameUSINGindex_methodPOLICYpolicy_nameONtable_namePROCEDURALLANGUAGEobject_namePROCEDUREsubprogram_name(subprogram_signature)PUBLICATIONobject_nameROLEobject_nameROUTINEsubprogram_name(subprogram_signature)RULErule_nameONtable_nameSCHEMAobject_nameSEQUENCEobject_nameSERVERobject_nameSTATISTICSobject_nameSUBSCRIPTIONobject_nameTABLEobject_nameTABLESPACEobject_nameTEXTSEARCHCONFIGURATIONobject_nameTEXTSEARCHDICTIONARYobject_nameTEXTSEARCHPARSERobject_nameTEXTSEARCHTEMPLATEobject_nameTRIGGERtrigger_nameONtable_nameTYPEobject_nameVIEWobject_nameIStext_literalNULL

commit

commit ::= COMMIT [ TRANSACTION | WORK ]

COMMITTRANSACTIONWORK

copy_from

copy_from ::= COPY table_name [ ( column_name [ , ... ] ) ]  FROM 
              { 'filename' | PROGRAM 'command' | STDIN }  
              [ [ WITH ] ( copy_option [ , ... ] ) ]

COPYtable_name(,column_name)FROMfilenamePROGRAMcommandSTDINWITH(,copy_option)

copy_to

copy_to ::= COPY { table_name [ ( column_names ) ] | subquery }  TO 
            { 'filename' | PROGRAM 'command' | STDOUT }  
            [ [ WITH ] ( copy_option [ , ... ] ) ]

COPYtable_name(column_names)subqueryTOfilenamePROGRAMcommandSTDOUTWITH(,copy_option)

copy_option

copy_option ::= FORMAT format_name
                | OIDS [ boolean ]
                | FREEZE [ boolean ]
                | DELIMITER 'delimiter_character'
                | NULL 'null_string'
                | HEADER [ boolean ]
                | QUOTE 'quote_character'
                | ESCAPE 'escape_character'
                | FORCE_QUOTE { ( column_names ) | * }
                | FORCE_NOT_NULL ( column_names )
                | FORCE_NULL ( column_names )
                | ENCODING 'encoding_name'
                | ROWS_PER_TRANSACTION int_literal
                | DISABLE_FK_CHECK
                | REPLACE
                | SKIP int_literal

FORMATformat_nameOIDSbooleanFREEZEbooleanDELIMITERdelimiter_characterNULLnull_stringHEADERbooleanQUOTEquote_characterESCAPEescape_characterFORCE_QUOTE(column_names)*FORCE_NOT_NULL(column_names)FORCE_NULL(column_names)ENCODINGencoding_nameROWS_PER_TRANSACTIONint_literalDISABLE_FK_CHECKREPLACESKIPint_literal

format_name

format_name ::= text_literal

text_literal

subquery

subquery ::= [ ( [ , ... ] ] { select | values } [ ) [ , ... ] ]

,(selectvalues,)

create_aggregate

create_aggregate ::= create_aggregate_normal
                     | create_aggregate_order_by
                     | create_aggregate_old

create_aggregate_normalcreate_aggregate_order_bycreate_aggregate_old

create_aggregate_normal

create_aggregate_normal ::= CREATE AGGREGATE aggregate_name ( 
                            { aggregate_arg [ , ... ] | * } )  ( SFUNC 
                            = sfunc , STYPE = state_data_type 
                            [ , aggregate_normal_option [ ... ] ] )

CREATEAGGREGATEaggregate_name(,aggregate_arg*)(SFUNC=sfunc,STYPE=state_data_type,aggregate_normal_option)

create_aggregate_order_by

create_aggregate_order_by ::= CREATE AGGREGATE aggregate_name ( 
                              [ aggregate_arg [ , ... ] ] ORDER BY 
                              aggregate_arg [ , ... ] )  ( SFUNC = 
                              sfunc , STYPE = state_data_type 
                              [ , aggregate_order_by_option [ ... ] ] 
                              )

CREATEAGGREGATEaggregate_name(,aggregate_argORDERBY,aggregate_arg)(SFUNC=sfunc,STYPE=state_data_type,aggregate_order_by_option)

create_aggregate_old

create_aggregate_old ::= CREATE AGGREGATE aggregate_name ( BASETYPE = 
                         base_type ,  SFUNC = sfunc , STYPE = 
                         state_data_type 
                         [ , aggregate_old_option [ ... ] ] )

CREATEAGGREGATEaggregate_name(BASETYPE=base_type,SFUNC=sfunc,STYPE=state_data_type,aggregate_old_option)

aggregate_arg

aggregate_arg ::= [ aggregate_arg_mode ] [ formal_arg ] arg_type

aggregate_arg_modeformal_argarg_type

aggregate_normal_option

aggregate_normal_option ::= SSPACE = state_data_size
                            | FINALFUNC = ffunc
                            | FINALFUNC_EXTRA
                            | FINALFUNC_MODIFY = 
                              { READ_ONLY | SHAREABLE | READ_WRITE }
                            | COMBINEFUNC = combinefunc
                            | SERIALFUNC = serialfunc
                            | DESERIALFUNC = deserialfunc
                            | INITCOND = initial_condition
                            | MSFUNC = msfunc
                            | MINVFUNC = minvfunc
                            | MSTYPE = mstate_data_type
                            | MSSPACE = mstate_data_size
                            | MFINALFUNC = mffunc
                            | MFINALFUNC_EXTRA
                            | MFINALFUNC_MODIFY = 
                              { READ_ONLY | SHAREABLE | READ_WRITE }
                            | MINITCOND = minitial_condition
                            | SORTOP = sort_operator
                            | PARALLEL = 
                              { SAFE | RESTRICTED | UNSAFE }

SSPACE=state_data_sizeFINALFUNC=ffuncFINALFUNC_EXTRAFINALFUNC_MODIFY=READ_ONLYSHAREABLEREAD_WRITECOMBINEFUNC=combinefuncSERIALFUNC=serialfuncDESERIALFUNC=deserialfuncINITCOND=initial_conditionMSFUNC=msfuncMINVFUNC=minvfuncMSTYPE=mstate_data_typeMSSPACE=mstate_data_sizeMFINALFUNC=mffuncMFINALFUNC_EXTRAMFINALFUNC_MODIFY=READ_ONLYSHAREABLEREAD_WRITEMINITCOND=minitial_conditionSORTOP=sort_operatorPARALLEL=SAFERESTRICTEDUNSAFE

aggregate_order_by_option

aggregate_order_by_option ::= SSPACE = state_data_size
                              | FINALFUNC = ffunc
                              | FINALFUNC_EXTRA
                              | FINALFUNC_MODIFY = 
                                { READ_ONLY | SHAREABLE | READ_WRITE }
                              | INITCOND = initial_condition
                              | PARALLEL = 
                                { SAFE | RESTRICTED | UNSAFE }
                              | HYPOTHETICAL

SSPACE=state_data_sizeFINALFUNC=ffuncFINALFUNC_EXTRAFINALFUNC_MODIFY=READ_ONLYSHAREABLEREAD_WRITEINITCOND=initial_conditionPARALLEL=SAFERESTRICTEDUNSAFEHYPOTHETICAL

aggregate_old_option

aggregate_old_option ::= SSPACE = state_data_size
                         | FINALFUNC = ffunc
                         | FINALFUNC_EXTRA
                         | FINALFUNC_MODIFY = 
                           { READ_ONLY | SHAREABLE | READ_WRITE }
                         | COMBINEFUNC = combinefunc
                         | SERIALFUNC = serialfunc
                         | DESERIALFUNC = deserialfunc
                         | INITCOND = initial_condition
                         | MSFUNC = msfunc
                         | MINVFUNC = minvfunc
                         | MSTYPE = mstate_data_type
                         | MSSPACE = mstate_data_size
                         | MFINALFUNC = mffunc
                         | MFINALFUNC_EXTRA
                         | MFINALFUNC_MODIFY = 
                           { READ_ONLY | SHAREABLE | READ_WRITE }
                         | MINITCOND = minitial_condition
                         | SORTOP = sort_operator

SSPACE=state_data_sizeFINALFUNC=ffuncFINALFUNC_EXTRAFINALFUNC_MODIFY=READ_ONLYSHAREABLEREAD_WRITECOMBINEFUNC=combinefuncSERIALFUNC=serialfuncDESERIALFUNC=deserialfuncINITCOND=initial_conditionMSFUNC=msfuncMINVFUNC=minvfuncMSTYPE=mstate_data_typeMSSPACE=mstate_data_sizeMFINALFUNC=mffuncMFINALFUNC_EXTRAMFINALFUNC_MODIFY=READ_ONLYSHAREABLEREAD_WRITEMINITCOND=minitial_conditionSORTOP=sort_operator

create_cast

create_cast ::= create_cast_with_function
                | create_cast_without_function
                | create_cast_with_inout

create_cast_with_functioncreate_cast_without_functioncreate_cast_with_inout

create_cast_with_function

create_cast_with_function ::= CREATE CAST ( cast_signature ) WITH 
                              FUNCTION  subprogram_name 
                              [ ( subprogram_signature ) ] 
                              [ AS ASSIGNMENT | AS IMPLICIT ]

CREATECAST(cast_signature)WITHFUNCTIONsubprogram_name(subprogram_signature)ASASSIGNMENTASIMPLICIT

create_cast_without_function

create_cast_without_function ::= CREATE CAST ( cast_signature ) 
                                 WITHOUT FUNCTION 
                                 [ AS ASSIGNMENT | AS IMPLICIT ]

CREATECAST(cast_signature)WITHOUTFUNCTIONASASSIGNMENTASIMPLICIT

create_cast_with_inout

create_cast_with_inout ::= CREATE CAST ( cast_signature ) WITH INOUT 
                           [ AS ASSIGNMENT | AS IMPLICIT ]

CREATECAST(cast_signature)WITHINOUTASASSIGNMENTASIMPLICIT

cast_signature

cast_signature ::= source_type AS target_type

source_typeAStarget_type

create_database

create_database ::= CREATE DATABASE name [ create_database_options ]

CREATEDATABASEnamecreate_database_options

create_database_options

create_database_options ::= [ WITH ] [ OWNER [ = ] user_name ]  
                            [ TEMPLATE [ = ] template_name ]  
                            [ ENCODING [ = ] encoding ]  
                            [ LC_COLLATE [ = ] lc_collate ]  
                            [ LC_CTYPE [ = ] lc_ctype ]  
                            [ ALLOW_CONNECTIONS [ = ] allowconn ]  
                            [ CONNECTION LIMIT [ = ] connlimit ]  
                            [ IS_TEMPLATE [ = ] istemplate ]  
                            [ COLOCATION [ = ] { 'true' | 'false' } ]

WITHOWNER=user_nameTEMPLATE=template_nameENCODING=encodingLC_COLLATE=lc_collateLC_CTYPE=lc_ctypeALLOW_CONNECTIONS=allowconnCONNECTIONLIMIT=connlimitIS_TEMPLATE=istemplateCOLOCATION=truefalse

user_name

user_name ::= name

name

template_name

template_name ::= name

name

encoding

encoding ::= text_literal

text_literal

lc_collate

lc_collate ::= text_literal

text_literal

lc_ctype

lc_ctype ::= text_literal

text_literal

create_domain

create_domain ::= CREATE DOMAIN name [ AS ] data_type 
                  [ DEFAULT expression ] 
                  [ [ domain_constraint [ ... ] ] ]

CREATEDOMAINnameASdata_typeDEFAULTexpressiondomain_constraint

domain_constraint

domain_constraint ::= [ CONSTRAINT constraint_name ] 
                      { NOT NULL | NULL | CHECK ( expression ) }

CONSTRAINTconstraint_nameNOTNULLNULLCHECK(expression)

create_extension

create_extension ::= CREATE EXTENSION [ IF NOT EXISTS ] extension_name 
                      [ WITH ] [ SCHEMA schema_name ] 
                     [ VERSION version ] [ CASCADE ]

CREATEEXTENSIONIFNOTEXISTSextension_nameWITHSCHEMAschema_nameVERSIONversionCASCADE

create_function

create_function ::= CREATE [ OR REPLACE ] FUNCTION subprogram_name ( 
                    [ arg_decl_with_dflt [ , ... ] ] )  
                    { RETURNS data_type
                      | RETURNS TABLE ( { column_name data_type } 
                        [ , ... ] ) }  
                    { unalterable_fn_attribute
                      | alterable_fn_only_attribute
                      | alterable_fn_and_proc_attribute } [ ... ]

CREATEORREPLACEFUNCTIONsubprogram_name(,arg_decl_with_dflt)RETURNSdata_typeRETURNSTABLE(,column_namedata_type)unalterable_fn_attributealterable_fn_only_attributealterable_fn_and_proc_attribute

arg_decl_with_dflt

arg_decl_with_dflt ::= arg_decl [ { DEFAULT | = } expression ]

arg_declDEFAULT=expression

arg_decl

arg_decl ::= [ formal_arg ] [ arg_mode ] arg_type

formal_argarg_modearg_type

subprogram_signature

subprogram_signature ::= arg_decl [ , ... ]

,arg_decl

fn_invocation

fn_invocation ::= subprogram_name ( [ actual_arg [ , ... ] ] )

subprogram_name(,actual_arg)

subprogram_call_signature

subprogram_call_signature ::= arg_type [ , ... ]

,arg_type

unalterable_fn_attribute

unalterable_fn_attribute ::= WINDOW
                             | LANGUAGE lang_name
                             | AS subprogram_implementation

WINDOWLANGUAGElang_nameASsubprogram_implementation

lang_name

lang_name ::= SQL | PLPGSQL | C

SQLPLPGSQLC

subprogram_implementation

subprogram_implementation ::= ' sql_stmt_list '
                              | ' plpgsql_block_stmt '
                              | ' obj_file ' [ , ' link_symbol ' ]

'sql_stmt_list''plpgsql_block_stmt''obj_file','link_symbol'

obj_file

obj_file ::= text_literal

text_literal

link_symbol ::= text_literal

text_literal

sql_stmt_list

sql_stmt_list ::= sql_stmt ; [ sql_stmt ... ]

sql_stmt;sql_stmt;

alterable_fn_and_proc_attribute

alterable_fn_and_proc_attribute ::= SET run_time_parameter 
                                    { TO value
                                      | = value
                                      | FROM CURRENT }
                                    | RESET run_time_parameter
                                    | RESET ALL
                                    | [ EXTERNAL ] SECURITY 
                                      { INVOKER | DEFINER }

SETrun_time_parameterTOvalue=valueFROMCURRENTRESETrun_time_parameterRESETALLEXTERNALSECURITYINVOKERDEFINER

alterable_fn_only_attribute

alterable_fn_only_attribute ::= volatility
                                | on_null_input
                                | PARALLEL parallel_mode
                                | [ NOT ] LEAKPROOF
                                | COST int_literal
                                | ROWS int_literal

volatilityon_null_inputPARALLELparallel_modeNOTLEAKPROOFCOSTint_literalROWSint_literal

volatility

volatility ::= IMMUTABLE | STABLE | VOLATILE

IMMUTABLESTABLEVOLATILE

on_null_input

on_null_input ::= CALLED ON NULL INPUT
                  | RETURNS NULL ON NULL INPUT
                  | STRICT

CALLEDONNULLINPUTRETURNSNULLONNULLINPUTSTRICT

parallel_mode

parallel_mode ::= UNSAFE | RESTRICTED | SAFE

UNSAFERESTRICTEDSAFE

create_foreign_data_wrapper

create_foreign_data_wrapper ::= CREATE FOREIGN DATA WRAPPER fdw_name  
                                [ HANDLER handler_name | NO HANDLER ] 
                                [ VALIDATOR validator_name
                                  | NO VALIDATOR ] 
                                [ OPTIONS ( fdw_options ) ]

CREATEFOREIGNDATAWRAPPERfdw_nameHANDLERhandler_nameNOHANDLERVALIDATORvalidator_nameNOVALIDATOROPTIONS(fdw_options)

create_foreign_table

create_foreign_table ::= CREATE FOREIGN TABLE [ IF NOT EXISTS ] 
                         table_name ( [ foreign_table_elem [ , ... ] ] 
                         )  SERVER server_name 
                         [ OPTIONS ( fdw_options ) ]

CREATEFOREIGNTABLEIFNOTEXISTStable_name(,foreign_table_elem)SERVERserver_nameOPTIONS(fdw_options)

foreign_table_elem

foreign_table_elem ::= column_name data_type 
                       [ OPTIONS ( fdw_options ) ] 
                       [ COLLATE collation ] 
                       [ column_constraint [ ... ] ]
                       | table_constraint

column_namedata_typeOPTIONS(fdw_options)COLLATEcollationcolumn_constrainttable_constraint

create_group

create_group ::= CREATE GROUP role_name 
                 [ [ WITH ] role_option [ , ... ] ]

CREATEGROUProle_nameWITH,role_option

create_index

create_index ::= CREATE [ UNIQUE ] INDEX 
                 [ CONCURRENTLY | NONCONCURRENTLY ]  
                 [ [ IF NOT EXISTS ] name ] ON [ ONLY ] table_name  
                 [ USING access_method_name ] ( index_elem [ , ... ] ) 
                  [ INCLUDE ( column_name [ , ... ] ) ]  
                 [ TABLESPACE tablespace_name ]  
                 [ SPLIT { INTO int_literal TABLETS
                           | AT VALUES ( split_row [ , ... ] ) } ] 
                 [ WHERE boolean_expression ]

CREATEUNIQUEINDEXCONCURRENTLYNONCONCURRENTLYIFNOTEXISTSnameONONLYtable_nameUSINGaccess_method_name(,index_elem)INCLUDE(,column_name)TABLESPACEtablespace_nameSPLITINTOint_literalTABLETSATVALUES(,split_row)WHEREboolean_expression

tablespace_name

tablespace_name ::= name

name

index_elem

index_elem ::= { column_name | ( expression ) } 
               [ operator_class_name ] [ HASH | ASC | DESC ] 
               [ NULLS { FIRST | LAST } ]

column_name(expression)operator_class_nameHASHASCDESCNULLSFIRSTLAST

create_matview

create_matview ::= CREATE MATERIALIZED VIEW [ IF NOT EXISTS ]  
                   matview_name [ ( column_name [ , ... ] ) ]  
                   [ WITH ( storage_parameters ) ]  
                   [ TABLESPACE tablespace_name ]  AS subquery 
                   [ WITH [ NO ] DATA ]

CREATEMATERIALIZEDVIEWIFNOTEXISTSmatview_name(,column_name)WITH(storage_parameters)TABLESPACEtablespace_nameASsubqueryWITHNODATA

create_operator

create_operator ::= CREATE OPERATOR operator_name  ( 
                    { FUNCTION = subprogram_name
                      | PROCEDURE = subprogram_name } 
                    [ , operator_option [ ... ] ] )

CREATEOPERATORoperator_name(FUNCTION=subprogram_namePROCEDURE=subprogram_name,operator_option)

operator_option

operator_option ::= LEFTARG = left_type
                    | RIGHTARG = right_type
                    | COMMUTATOR = com_op
                    | NEGATOR = neg_op
                    | RESTRICT = res_proc
                    | JOIN = join_proc
                    | HASHES
                    | MERGES

LEFTARG=left_typeRIGHTARG=right_typeCOMMUTATOR=com_opNEGATOR=neg_opRESTRICT=res_procJOIN=join_procHASHESMERGES

create_operator_class

create_operator_class ::= CREATE OPERATOR CLASS operator_class_name 
                          [ DEFAULT ] FOR TYPE data_type  USING 
                          index_method AS operator_class_as [ , ... ]

CREATEOPERATORCLASSoperator_class_nameDEFAULTFORTYPEdata_typeUSINGindex_methodAS,operator_class_as

operator_class_as

operator_class_as ::= OPERATOR strategy_number operator_name 
                      [ ( operator_signature ) ] [ FOR SEARCH ]
                      | FUNCTION support_number 
                        [ ( op_type [ , ... ] ) ] subprogram_name ( 
                        subprogram_signature )
                      | STORAGE storage_type

OPERATORstrategy_numberoperator_name(operator_signature)FORSEARCHFUNCTIONsupport_number(,op_type)subprogram_name(subprogram_signature)STORAGEstorage_type

create_policy

create_policy ::= CREATE POLICY name ON table_name 
                  [ AS { PERMISSIVE | RESTRICTIVE } ]  
                  [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ] 
                  [ TO { role_name
                         | PUBLIC
                         | CURRENT_USER
                         | SESSION_USER } [ , ... ] ]  
                  [ USING ( using_expression ) ] 
                  [ WITH CHECK ( check_expression ) ]

CREATEPOLICYnameONtable_nameASPERMISSIVERESTRICTIVEFORALLSELECTINSERTUPDATEDELETETO,role_namePUBLICCURRENT_USERSESSION_USERUSING(using_expression)WITHCHECK(check_expression)

create_procedure

create_procedure ::= CREATE [ OR REPLACE ] PROCEDURE subprogram_name ( 
                     [ arg_decl_with_dflt [ , ... ] ] )  
                     { unalterable_proc_attribute
                       | alterable_fn_and_proc_attribute } [ ... ]

CREATEORREPLACEPROCEDUREsubprogram_name(,arg_decl_with_dflt)unalterable_proc_attributealterable_fn_and_proc_attribute

unalterable_proc_attribute

unalterable_proc_attribute ::= LANGUAGE lang_name
                               | AS subprogram_implementation

LANGUAGElang_nameASsubprogram_implementation

create_rule

create_rule ::= CREATE [ OR REPLACE ] RULE rule_name AS ON rule_event 
                TO table_name  [ WHERE boolean_expression ] DO 
                [ ALSO | INSTEAD ] { NOTHING
                                     | command
                                     | ( command [ ; ... ] ) }

CREATEORREPLACERULErule_nameASONrule_eventTOtable_nameWHEREboolean_expressionDOALSOINSTEADNOTHINGcommand(;command)

rule_event

rule_event ::= SELECT | INSERT | UPDATE | DELETE

SELECTINSERTUPDATEDELETE

command

command ::= SELECT | INSERT | UPDATE | DELETE | NOTIFY

SELECTINSERTUPDATEDELETENOTIFY

create_role

create_role ::= CREATE ROLE role_name 
                [ [ WITH ] role_option [ , ... ] ]

CREATEROLErole_nameWITH,role_option

role_option

role_option ::= SUPERUSER
                | NOSUPERUSER
                | CREATEDB
                | NOCREATEDB
                | CREATEROLE
                | NOCREATEROLE
                | INHERIT
                | NOINHERIT
                | LOGIN
                | NOLOGIN
                | CONNECTION LIMIT connlimit
                | [ ENCRYPTED ] PASSWORD  ' password ' 
                | PASSWORD NULL
                | VALID UNTIL  ' timestamp ' 
                | IN ROLE role_name [ , ... ]
                | IN GROUP role_name [ , ... ]
                | ROLE role_name [ , ... ]
                | ADMIN role_name [ , ... ]
                | USER role_name [ , ... ]
                | SYSID uid

SUPERUSERNOSUPERUSERCREATEDBNOCREATEDBCREATEROLENOCREATEROLEINHERITNOINHERITLOGINNOLOGINCONNECTIONLIMITconnlimitENCRYPTEDPASSWORD password PASSWORDNULLVALIDUNTIL timestamp INROLE,role_nameINGROUP,role_nameROLE,role_nameADMIN,role_nameUSER,role_nameSYSIDuid

password

password ::= text_literal

text_literal

timestamp

timestamp ::= '<DateTime Literal>'

<DateTime Literal>

uid

uid ::= text_literal

text_literal

create_schema_name

create_schema_name ::= CREATE SCHEMA [ IF NOT EXISTS ] schema_name 
                       [ AUTHORIZATION role_specification ]

CREATESCHEMAIFNOTEXISTSschema_nameAUTHORIZATIONrole_specification

create_schema_role

create_schema_role ::= CREATE SCHEMA [ IF NOT EXISTS ] AUTHORIZATION 
                       role_specification

CREATESCHEMAIFNOTEXISTSAUTHORIZATIONrole_specification

create_sequence

create_sequence ::= CREATE [ TEMPORARY | TEMP ] SEQUENCE 
                    [ IF NOT EXISTS ] sequence_name sequence_options

CREATETEMPORARYTEMPSEQUENCEIFNOTEXISTSsequence_namesequence_options

sequence_name

sequence_name ::= qualified_name

qualified_name

sequence_options

sequence_options ::= [ AS seq_data_type ]  
                     [ INCREMENT [ BY ] int_literal ]  
                     [ MINVALUE int_literal | NO MINVALUE ]  
                     [ MAXVALUE int_literal | NO MAXVALUE ]  
                     [ START [ WITH ] int_literal ]  
                     [ CACHE positive_int_literal ] [ [ NO ] CYCLE ]

ASseq_data_typeINCREMENTBYint_literalMINVALUEint_literalNOMINVALUEMAXVALUEint_literalNOMAXVALUESTARTWITHint_literalCACHEpositive_int_literalNOCYCLE

create_server

create_server ::= CREATE SERVER [ IF NOT EXISTS ] server_name  
                  [ TYPE server_type ] [ VERSION server_version ]  
                  FOREIGN DATA WRAPPER fdw_name 
                  [ OPTIONS ( fdw_options ) ]

CREATESERVERIFNOTEXISTSserver_nameTYPEserver_typeVERSIONserver_versionFOREIGNDATAWRAPPERfdw_nameOPTIONS(fdw_options)

server_type

server_type ::= text_literal

text_literal

create_tablespace

create_tablespace ::= CREATE TABLESPACE tablespace_name 
                      [ WITH ( 
                        { 'tablespace_option' = value 
                        [ ,'tablespace_option'= ... ] } ) ]

CREATETABLESPACEtablespace_nameWITH(tablespace_option=value,tablespace_option=value)

drop_tablespace

drop_tablespace ::= DROP TABLESPACE [ IF EXISTS ] tablespace_name

DROPTABLESPACEIFEXISTStablespace_name

create_table

create_table ::= CREATE [ TEMPORARY | TEMP ] TABLE [ IF NOT EXISTS ] 
                 table_name ( [ table_elem [ , ... ] ] )  
                 [ WITH ( { COLOCATION = { 'true' | 'false' }
                            | storage_parameters } )
                   | WITHOUT OIDS ]  [ TABLESPACE tablespace_name ] 
                 [ SPLIT { INTO positive_int_literal TABLETS
                           | AT VALUES ( split_row [ , ... ] ) } ]

CREATETEMPORARYTEMPTABLEIFNOTEXISTStable_name(,table_elem)WITH(COLOCATION=truefalsestorage_parameters)WITHOUTOIDSTABLESPACEtablespace_nameSPLITINTOpositive_int_literalTABLETSATVALUES(,split_row)

split_row

split_row ::= ( column_value [ , ... ] )

(,column_value)

table_elem

table_elem ::= column_name data_type [ column_constraint [ ... ] ]
               | table_constraint

column_namedata_typecolumn_constrainttable_constraint

column_constraint

column_constraint ::= [ CONSTRAINT constraint_name ] 
                      { NOT NULL
                        | NULL
                        | CHECK ( expression )
                        | DEFAULT expression
                        | GENERATED { ALWAYS | BY DEFAULT } AS 
                          IDENTITY [ sequence_options ]
                        | UNIQUE index_parameters
                        | PRIMARY KEY
                        | references_clause }  
                      [ DEFERRABLE | NOT DEFERRABLE ] 
                      [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

CONSTRAINTconstraint_nameNOTNULLNULLCHECK(expression)DEFAULTexpressionGENERATEDALWAYSBY DEFAULTASIDENTITYsequence_optionsUNIQUEindex_parametersPRIMARYKEYreferences_clauseDEFERRABLENOTDEFERRABLEINITIALLYDEFERREDINITIALLYIMMEDIATE

table_constraint

table_constraint ::= [ CONSTRAINT constraint_name ] 
                     { CHECK ( expression )
                       | UNIQUE ( column_names ) index_parameters
                       | PRIMARY KEY ( key_columns )
                       | FOREIGN KEY ( column_names ) 
                         references_clause }  
                     [ DEFERRABLE | NOT DEFERRABLE ] 
                     [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

CONSTRAINTconstraint_nameCHECK(expression)UNIQUE(column_names)index_parametersPRIMARYKEY(key_columns)FOREIGNKEY(column_names)references_clauseDEFERRABLENOTDEFERRABLEINITIALLYDEFERREDINITIALLYIMMEDIATE

key_columns

key_columns ::= hash_columns [ , range_columns ] | range_columns

hash_columns,range_columnsrange_columns

hash_columns

hash_columns ::= column_name [ HASH ] | ( column_name [ , ... ] ) HASH

column_nameHASH(,column_name)HASH

range_columns

range_columns ::= { column_name { ASC | DESC } } [ , ... ]

,column_nameASCDESC

references_clause

references_clause ::= REFERENCES table_name [ column_name [ , ... ] ] 
                      [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]  
                      [ ON DELETE key_action ] 
                      [ ON UPDATE key_action ]

REFERENCEStable_name,column_nameMATCHFULLMATCHPARTIALMATCHSIMPLEONDELETEkey_actionONUPDATEkey_action

key_action

key_action ::= NO ACTION | RESTRICT | CASCADE | SET NULL | SET DEFAULT

NOACTIONRESTRICTCASCADESETNULLSETDEFAULT

storage_parameters

storage_parameters ::= storage_parameter [ , ... ]

,storage_parameter

storage_parameter

storage_parameter ::= param_name [ = param_value ]

param_name=param_value

index_parameters

index_parameters ::= [ INCLUDE ( column_names ) ] 
                     [ WITH ( storage_parameters ) ]  
                     [ USING INDEX TABLESPACE tablespace_name ]

INCLUDE(column_names)WITH(storage_parameters)USINGINDEXTABLESPACEtablespace_name

create_table_as

create_table_as ::= CREATE [ TEMPORARY | TEMP ] TABLE 
                    [ IF NOT EXISTS ]  table_name 
                    [ ( column_name [ , ... ] ) ]  AS subquery 
                    [ WITH [ NO ] DATA ]

CREATETEMPORARYTEMPTABLEIFNOTEXISTStable_name(,column_name)ASsubqueryWITHNODATA

create_trigger

create_trigger ::= CREATE TRIGGER name { BEFORE | AFTER | INSTEAD OF } 
                   { event [ OR ... ] } ON table_name 
                   [ FROM table_name ]  [ NOT DEFERRABLE ] 
                   [ FOR [ EACH ] { ROW | STATEMENT } ] 
                   [ WHEN ( boolean_expression ) ]  EXECUTE 
                   { FUNCTION | PROCEDURE } subprogram_name ( 
                   [ subprogram_signature ] )

CREATETRIGGERnameBEFOREAFTERINSTEADOFOReventONtable_nameFROMtable_nameNOTDEFERRABLEFOREACHROWSTATEMENTWHEN(boolean_expression)EXECUTEFUNCTIONPROCEDUREsubprogram_name(subprogram_signature)

event

event ::= INSERT
          | UPDATE [ OF column_name [ , ... ] ]
          | DELETE
          | TRUNCATE

INSERTUPDATEOF,column_nameDELETETRUNCATE

create_type

create_type ::= create_composite_type
                | create_enum_type
                | create_range_type
                | create_shell_type
                | create_base_type

create_composite_typecreate_enum_typecreate_range_typecreate_shell_typecreate_base_type

create_composite_type

create_composite_type ::= CREATE TYPE type_name AS ( 
                          [ composite_type_elem [ , ... ] ] )

CREATETYPEtype_nameAS(,composite_type_elem)

create_enum_type

create_enum_type ::= CREATE TYPE type_name AS ENUM ( 
                     [ name [ , ... ] ] )

CREATETYPEtype_nameASENUM(,name)

create_range_type

create_range_type ::= CREATE TYPE type_name AS RANGE  ( SUBTYPE = 
                      subtype [ , range_type_option [ ... ] ] )

CREATETYPEtype_nameASRANGE(SUBTYPE=subtype,range_type_option)

create_shell_type

create_shell_type ::= CREATE TYPE type_name

CREATETYPEtype_name

create_base_type

create_base_type ::= CREATE TYPE type_name (  INPUT = input_function , 
                      OUTPUT = output_function 
                     [ , base_type_option [ ... ] ]  )

CREATETYPEtype_name(INPUT=input_function,OUTPUT=output_function,base_type_option)

composite_type_elem

composite_type_elem ::= attribute_name data_type [ COLLATE collation ]

attribute_namedata_typeCOLLATEcollation

range_type_option

range_type_option ::= SUBTYPE_OPCLASS = subtype_operator_class
                      | COLLATION = collation
                      | CANONICAL = canonical_function
                      | SUBTYPE_DIFF = subtype_diff_function

SUBTYPE_OPCLASS=subtype_operator_classCOLLATION=collationCANONICAL=canonical_functionSUBTYPE_DIFF=subtype_diff_function

base_type_option

base_type_option ::= RECEIVE = receive_function
                     | SEND = send_function
                     | TYPMOD_IN = type_modifier_input_function
                     | TYPMOD_OUT = type_modifier_output_function
                     | INTERNALLENGTH = { internallength | VARIABLE }
                     | PASSEDBYVALUE
                     | ALIGNMENT = alignment
                     | STORAGE = storage
                     | LIKE = like_type
                     | CATEGORY = category
                     | PREFERRED = { TRUE | FALSE }
                     | DEFAULT = default_type_value
                     | ELEMENT = element
                     | DELIMITER = delimiter
                     | COLLATABLE = { TRUE | FALSE }

RECEIVE=receive_functionSEND=send_functionTYPMOD_IN=type_modifier_input_functionTYPMOD_OUT=type_modifier_output_functionINTERNALLENGTH=internallengthVARIABLEPASSEDBYVALUEALIGNMENT=alignmentSTORAGE=storageLIKE=like_typeCATEGORY=categoryPREFERRED=TRUEFALSEDEFAULT=default_type_valueELEMENT=elementDELIMITER=delimiterCOLLATABLE=TRUEFALSE

create_user

create_user ::= CREATE USER role_name 
                [ [ WITH ] role_option [ , ... ] ]

CREATEUSERrole_nameWITH,role_option

create_user_mapping

create_user_mapping ::= CREATE USER MAPPING [ IF NOT EXISTS ]  FOR 
                        user SERVER server_name  
                        [ OPTIONS ( fdw_options ) ]

CREATEUSERMAPPINGIFNOTEXISTSFORuserSERVERserver_nameOPTIONS(fdw_options)

user

user ::= user_name | USER | CURRENT_USER | PUBLIC

user_nameUSERCURRENT_USERPUBLIC

create_view

create_view ::= CREATE [ OR REPLACE ] [ TEMPORARY | TEMP ] VIEW 
                qualified_name  [ ( column_name [ , ... ] ) ] AS 
                select

CREATEORREPLACETEMPORARYTEMPVIEWqualified_name(,column_name)ASselect

deallocate

deallocate ::= DEALLOCATE [ PREPARE ] { name | ALL }

DEALLOCATEPREPAREnameALL

declare

declare ::= DECLARE cursor_name [ BINARY ] [ INSENSITIVE ] 
            [ [ NO ] SCROLL ]  CURSOR [ { WITH | WITHOUT } HOLD ] FOR 
            subquery

DECLAREcursor_nameBINARYINSENSITIVENOSCROLLCURSORWITHWITHOUTHOLDFORsubquery

cursor_name

cursor_name ::= name

name

move

move ::= MOVE [ move_to_one_row | move_over_many_rows ] [ FROM | IN ] 
         name

MOVEmove_to_one_rowmove_over_many_rowsFROMINname

move_to_one_row

move_to_one_row ::= FIRST
                    | LAST
                    | ABSOLUTE int_literal
                    | NEXT
                    | FORWARD
                    | PRIOR
                    | BACKWARD
                    | RELATIVE int_literal

FIRSTLASTABSOLUTEint_literalNEXTFORWARDPRIORBACKWARDRELATIVEint_literal

move_over_many_rows

move_over_many_rows ::= ALL | FORWARD ALL
                        | FORWARD int_literal
                        | int_literal
                        | BACKWARD ALL
                        | BACKWARD int_literal

ALLFORWARDALLFORWARDint_literalint_literalBACKWARDALLBACKWARDint_literal

fetch

fetch ::= FETCH [ fetch_one_row | fetch_many_rows ] [ FROM | IN ] name

FETCHfetch_one_rowfetch_many_rowsFROMINname

fetch_one_row

fetch_one_row ::= FIRST
                  | LAST
                  | ABSOLUTE int_literal
                  | NEXT
                  | FORWARD
                  | PRIOR
                  | BACKWARD
                  | RELATIVE int_literal

FIRSTLASTABSOLUTEint_literalNEXTFORWARDPRIORBACKWARDRELATIVEint_literal

fetch_many_rows

fetch_many_rows ::= ALL | FORWARD ALL
                    | FORWARD int_literal
                    | int_literal
                    | BACKWARD ALL
                    | BACKWARD int_literal

ALLFORWARDALLFORWARDint_literalint_literalBACKWARDALLBACKWARDint_literal

close

close ::= CLOSE { name | ALL }

CLOSEnameALL

delete

delete ::= [ with_clause ]  DELETE FROM table_expr [ [ AS ] alias ]  
           [ WHERE boolean_expression | WHERE CURRENT OF cursor_name ] 
            [ returning_clause ]

with_clauseDELETEFROMtable_exprASaliasWHEREboolean_expressionWHERECURRENTOFcursor_namereturning_clause

alias

alias ::= name

name

returning_clause

returning_clause ::= RETURNING { * | { output_expression 
                                     [ [ AS ] output_name ] } 
                                     [ , ... ] }

RETURNING*,output_expressionASoutput_name

returning_expression

returning_expression ::= output_expression [ [ AS ] output_name ]

output_expressionASoutput_name

output_expression

output_expression ::= expression

expression

output_name

output_name ::= name

name

do

do ::= DO ' plpgsql_block_stmt '

DO'plpgsql_block_stmt'

drop_aggregate

drop_aggregate ::= DROP AGGREGATE [ IF EXISTS ] 
                   { aggregate_name ( aggregate_signature ) } 
                   [ , ... ] [ CASCADE | RESTRICT ]

DROPAGGREGATEIFEXISTS,aggregate_name(aggregate_signature)CASCADERESTRICT

aggregate_signature

aggregate_signature ::= * | aggregate_arg [ , ... ]
                        | [ aggregate_arg [ , ... ] ] ORDER BY 
                          aggregate_arg [ , ... ]

*,aggregate_arg,aggregate_argORDERBY,aggregate_arg

drop_cast

drop_cast ::= DROP CAST [ IF EXISTS ] ( cast_signature ) 
              [ CASCADE | RESTRICT ]

DROPCASTIFEXISTS(cast_signature)CASCADERESTRICT

drop_database

drop_database ::= DROP DATABASE [ IF EXISTS ] database_name

DROPDATABASEIFEXISTSdatabase_name

drop_schema

drop_schema ::= DROP SCHEMA [ IF EXISTS ] schema_name [ , ... ] 
                [ CASCADE | RESTRICT ]

DROPSCHEMAIFEXISTS,schema_nameCASCADERESTRICT

drop_domain

drop_domain ::= DROP DOMAIN [ IF EXISTS ] name [ , ... ] 
                [ CASCADE | RESTRICT ]

DROPDOMAINIFEXISTS,nameCASCADERESTRICT

drop_extension

drop_extension ::= DROP EXTENSION [ IF EXISTS ] extension_name 
                   [ , ... ] [ CASCADE | RESTRICT ]

DROPEXTENSIONIFEXISTS,extension_nameCASCADERESTRICT

drop_foreign_data_wrapper

drop_foreign_data_wrapper ::= DROP FOREIGN DATA WRAPPER [ IF EXISTS ] 
                              fdw_name [ CASCADE | RESTRICT ]

DROPFOREIGNDATAWRAPPERIFEXISTSfdw_nameCASCADERESTRICT

drop_foreign_table

drop_foreign_table ::= DROP FOREIGN TABLE [ IF EXISTS ] table_name 
                       [ CASCADE | RESTRICT ]

DROPFOREIGNTABLEIFEXISTStable_nameCASCADERESTRICT

drop_function

drop_function ::= DROP FUNCTION [ IF EXISTS ]  
                  { subprogram_name ( [ subprogram_signature ] ) } 
                  [ , ... ] [ CASCADE | RESTRICT ]

DROPFUNCTIONIFEXISTS,subprogram_name(subprogram_signature)CASCADERESTRICT

drop_group

drop_group ::= DROP GROUP [ IF EXISTS ] role_name [ , ... ]

DROPGROUPIFEXISTS,role_name

drop_matview

drop_matview ::= DROP MATERIALIZED VIEW [ IF EXISTS ] matview_name  
                 [ CASCADE | RESTRICT ]

DROPMATERIALIZEDVIEWIFEXISTSmatview_nameCASCADERESTRICT

drop_operator

drop_operator ::= DROP OPERATOR [ IF EXISTS ] 
                  { operator_name ( operator_signature ) } [ , ... ] 
                  [ CASCADE | RESTRICT ]

DROPOPERATORIFEXISTS,operator_name(operator_signature)CASCADERESTRICT

operator_signature

operator_signature ::= { left_type | NONE } , { right_type | NONE }

left_typeNONE,right_typeNONE

drop_operator_class

drop_operator_class ::= DROP OPERATOR CLASS [ IF EXISTS ] 
                        operator_class_name USING index_method 
                        [ CASCADE | RESTRICT ]

DROPOPERATORCLASSIFEXISTSoperator_class_nameUSINGindex_methodCASCADERESTRICT

drop_policy

drop_policy ::= DROP POLICY [ IF EXISTS ] name ON table_name 
                [ CASCADE | RESTRICT ]

DROPPOLICYIFEXISTSnameONtable_nameCASCADERESTRICT

drop_procedure

drop_procedure ::= DROP PROCEDURE [ IF EXISTS ]  
                   { subprogram_name ( [ subprogram_signature ] ) } 
                   [ , ... ] [ CASCADE | RESTRICT ]

DROPPROCEDUREIFEXISTS,subprogram_name(subprogram_signature)CASCADERESTRICT

drop_role

drop_role ::= DROP ROLE [ IF EXISTS ] role_name [ , ... ]

DROPROLEIFEXISTS,role_name

drop_rule

drop_rule ::= DROP RULE [ IF EXISTS ] rule_name ON table_name 
              [ CASCADE | RESTRICT ]

DROPRULEIFEXISTSrule_nameONtable_nameCASCADERESTRICT

drop_sequence

drop_sequence ::= DROP SEQUENCE [ IF EXISTS ] sequence_name 
                  [ CASCADE | RESTRICT ]

DROPSEQUENCEIFEXISTSsequence_nameCASCADERESTRICT

drop_owned

drop_owned ::= DROP OWNED BY role_specification [ , ... ] 
               [ CASCADE | RESTRICT ]

DROPOWNEDBY,role_specificationCASCADERESTRICT

drop_server

drop_server ::= DROP SERVER [ IF EXISTS ] server_name 
                [ CASCADE | RESTRICT ]

DROPSERVERIFEXISTSserver_nameCASCADERESTRICT

drop_table

drop_table ::= DROP TABLE [ IF EXISTS ] table_name [ , ... ] 
               [ CASCADE | RESTRICT ]

DROPTABLEIFEXISTS,table_nameCASCADERESTRICT

drop_index

drop_index ::= DROP INDEX [ IF EXISTS ] index_name 
               [ CASCADE | RESTRICT ]

DROPINDEXIFEXISTSindex_nameCASCADERESTRICT

index_name

index_name ::= name

name

drop_type

drop_type ::= DROP TYPE [ IF EXISTS ] type_name [ , ... ] 
              [ CASCADE | RESTRICT ]

DROPTYPEIFEXISTS,type_nameCASCADERESTRICT

drop_user

drop_user ::= DROP USER [ IF EXISTS ] role_name [ , ... ]

DROPUSERIFEXISTS,role_name

drop_trigger

drop_trigger ::= DROP TRIGGER [ IF EXISTS ] name ON table_name 
                 [ CASCADE | RESTRICT ]

DROPTRIGGERIFEXISTSnameONtable_nameCASCADERESTRICT

end

end ::= END [ TRANSACTION | WORK ]

ENDTRANSACTIONWORK

execute_statement

execute_statement ::= EXECUTE name [ ( expression [ , ... ] ) ]

EXECUTEname(,expression)

explain

explain ::= EXPLAIN [ [ ANALYZE ] [ VERBOSE ] | ( option [ , ... ] ) ] 
            sql_stmt

EXPLAINANALYZEVERBOSE(,option)sql_stmt

option

option ::= ANALYZE [ boolean ]
           | BUFFERS [ boolean ]
           | COSTS [ boolean ]
           | DEBUG [ boolean ]
           | DIST [ boolean ]
           | FORMAT { TEXT | XML | JSON | YAML }

ANALYZEbooleanBUFFERSbooleanCOSTSbooleanDEBUGbooleanDISTbooleanFORMATTEXTXMLJSONYAML

| 'SUMMARY' [ boolean ]

       | 'TIMING' [ boolean ]
       | 'VERBOSE' [ boolean ]

grant

| 'SUMMARY' [ boolean ]
           | 'TIMING' [ boolean ]
           | 'VERBOSE' [ boolean ]


grant ::= grant_table
                                                                                                         | grant_table_col
                                                                                                         | grant_seq
                                                                                                         | grant_db
                                                                                                         | grant_domain
                                                                                                         | grant_schema
                                                                                                         | grant_type
                                                                                                         | grant_role

grant_tablegrant_table_colgrant_seqgrant_dbgrant_domaingrant_schemagrant_typegrant_role

grant_table

grant_table ::= GRANT 
                { { SELECT
                    | INSERT
                    | UPDATE
                    | DELETE
                    | TRUNCATE
                    | REFERENCES
                    | TRIGGER } [ , ... ]
                  | ALL [ PRIVILEGES ] }  ON 
                { [ TABLE ] table_name [ , ... ]
                  | ALL TABLES IN SCHEMA schema_name [ , ... ] }  TO 
                grantee_role [ , ... ] [ WITH GRANT OPTION ]

GRANT,SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERALLPRIVILEGESONTABLE,table_nameALLTABLESINSCHEMA,schema_nameTO,grantee_roleWITHGRANTOPTION

grant_table_col

grant_table_col ::= GRANT 
                    { { SELECT | INSERT | UPDATE | REFERENCES } ( 
                      column_names )
                      | ALL [ PRIVILEGES ] ( column_names ) }  ON 
                    { [ TABLE ] table_name [ , ... ] }  TO 
                    grantee_role [ , ... ]  [ WITH GRANT OPTION ]

GRANTSELECTINSERTUPDATEREFERENCES(column_names)ALLPRIVILEGES(column_names)ONTABLE,table_nameTO,grantee_roleWITHGRANTOPTION

grant_seq

grant_seq ::= GRANT { { USAGE | SELECT | UPDATE } [ , ... ]
                      | ALL [ PRIVILEGES ] }  ON 
              { SEQUENCE sequence_name [ , ... ]
                | ALL SEQUENCES IN SCHEMA schema_name [ , ... ] }  TO 
              grantee_role [ , ... ]  [ WITH GRANT OPTION ]

GRANT,USAGESELECTUPDATEALLPRIVILEGESONSEQUENCE,sequence_nameALLSEQUENCESINSCHEMA,schema_nameTO,grantee_roleWITHGRANTOPTION

grant_db

grant_db ::= GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [ , ... ]
                     | ALL [ PRIVILEGES ] }  ON DATABASE database_name 
             [ , ... ]  TO grantee_role [ , ... ] 
             [ WITH GRANT OPTION ]

GRANT,CREATECONNECTTEMPORARYTEMPALLPRIVILEGESONDATABASE,database_nameTO,grantee_roleWITHGRANTOPTION

grant_domain

grant_domain ::= GRANT { USAGE | ALL [ PRIVILEGES ] }  ON DOMAIN 
                 domain_name [ , ... ]  TO grantee_role [ , ... ]  
                 [ WITH GRANT OPTION ]

GRANTUSAGEALLPRIVILEGESONDOMAIN,domain_nameTO,grantee_roleWITHGRANTOPTION

grant_schema

grant_schema ::= GRANT { { CREATE | USAGE } [ , ... ]
                         | ALL [ PRIVILEGES ] }  ON SCHEMA schema_name 
                 [ , ... ]  TO grantee_role [ , ... ]  
                 [ WITH GRANT OPTION ]

GRANT,CREATEUSAGEALLPRIVILEGESONSCHEMA,schema_nameTO,grantee_roleWITHGRANTOPTION

grant_type

grant_type ::= GRANT { USAGE | ALL [ PRIVILEGES ] }  ON TYPE type_name 
               [ , ... ]  TO grantee_role [ , ... ]  
               [ WITH GRANT OPTION ]

GRANTUSAGEALLPRIVILEGESONTYPE,type_nameTO,grantee_roleWITHGRANTOPTION

grant_role

grant_role ::= GRANT role_name [ , ... ] TO role_name 
               [ , grantee_role [ ... ] ]  [ WITH ADMIN OPTION ]

GRANT,role_nameTOrole_name,grantee_roleWITHADMINOPTION

grantee_role

grantee_role ::= [ GROUP ] role_name
                 | PUBLIC
                 | CURRENT_USER
                 | SESSION_USER

GROUProle_namePUBLICCURRENT_USERSESSION_USER

import_foreign_schema

import_foreign_schema ::= IMPORT FOREIGN SCHEMA remote_schema  
                          [ { LIMIT TO | EXCEPT } ( table_name [ ... ] 
                            ) ]  FROM SERVER server_name INTO 
                          local_schema  [ OPTIONS ( fdw_options ) ]

IMPORTFOREIGNSCHEMAremote_schemaLIMITTOEXCEPT(table_name)FROMSERVERserver_nameINTOlocal_schemaOPTIONS(fdw_options)

remote_schema

remote_schema ::= text_literal

text_literal

local_schema

local_schema ::= text_literal

text_literal

insert

insert ::= [ with_clause ]  INSERT INTO table_name [ AS alias ] 
           [ ( column_names ) ]  
           [ OVERRIDING [ SYSTEM | USER [ ... ] ] VALUE ] 
           { DEFAULT VALUES
             | VALUES ( column_values ) [ ,(column_values ... ]
             | subquery }  
           [ ON CONFLICT [ conflict_target ] conflict_action ]  
           [ returning_clause ]

with_clauseINSERTINTOtable_nameASalias(column_names)OVERRIDINGSYSTEMUSERVALUEDEFAULTVALUESVALUES(column_values),(column_values)subqueryONCONFLICTconflict_targetconflict_actionreturning_clause

column_values

column_values ::= { expression | DEFAULT } [ , ... ]

,expressionDEFAULT

conflict_target

conflict_target ::= ( { column_name | expression } [ , ... ] ) 
                    [ WHERE boolean_expression ]
                    | ON CONSTRAINT constraint_name

(,column_nameexpression)WHEREboolean_expressionONCONSTRAINTconstraint_name

conflict_action

conflict_action ::= DO NOTHING
                    | DO UPDATE SET update_item [ , ... ] 
                      [ WHERE boolean_expression ]

DONOTHINGDOUPDATESET,update_itemWHEREboolean_expression

lock_table

lock_table ::= LOCK [ TABLE ] { table_expr [ , ... ] } 
               [ IN lockmode MODE ] [ NOWAIT ]

LOCKTABLE,table_exprINlockmodeMODENOWAIT

lockmode

lockmode ::= ACCESS SHARE
             | ROW SHARE
             | ROW EXCLUSIVE
             | SHARE UPDATE EXCLUSIVE
             | SHARE
             | SHARE ROW EXCLUSIVE
             | EXCLUSIVE
             | ACCESS EXCLUSIVE

ACCESSSHAREROWSHAREROWEXCLUSIVESHAREUPDATEEXCLUSIVESHARESHAREROWEXCLUSIVEEXCLUSIVEACCESSEXCLUSIVE

prepare_statement

prepare_statement ::= PREPARE name [ ( data_type [ , ... ] ) ] AS 
                      subquery

PREPAREname(,data_type)ASsubquery

reassign_owned

reassign_owned ::= REASSIGN OWNED BY role_specification [ , ... ] TO 
                   role_specification

REASSIGNOWNEDBY,role_specificationTOrole_specification

refresh_matview

refresh_matview ::= REFRESH MATERIALIZED VIEW [ CONCURRENTLY ]  
                    matview_name [ WITH [ NO ] DATA ]

REFRESHMATERIALIZEDVIEWCONCURRENTLYmatview_nameWITHNODATA

reset_stmt

reset_stmt ::= RESET { run_time_parameter | ALL }

RESETrun_time_parameterALL

reset_role

reset_role ::= RESET ROLE

RESETROLE

reset_session_authorization

reset_session_authorization ::= RESET SESSION AUTHORIZATION

RESETSESSIONAUTHORIZATION

revoke_table

revoke_table ::= REVOKE [ GRANT OPTION FOR ] 
                 { { SELECT
                     | INSERT
                     | UPDATE
                     | DELETE
                     | TRUNCATE
                     | REFERENCES
                     | TRIGGER } [ , ... ]
                   | ALL [ PRIVILEGES ] }  ON 
                 { [ TABLE ] table_name [ , ... ]
                   | ALL TABLES IN SCHEMA schema_name [ , ... ] }  
                 FROM { [ GROUP ] role_name | PUBLIC } [ , ... ] 
                 [ CASCADE | RESTRICT ]

REVOKEGRANTOPTIONFOR,SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERALLPRIVILEGESONTABLE,table_nameALLTABLESINSCHEMA,schema_nameFROM,GROUProle_namePUBLICCASCADERESTRICT

revoke_table_col

revoke_table_col ::= REVOKE [ GRANT OPTION FOR ]  
                     { { SELECT | INSERT | UPDATE | REFERENCES } ( 
                       column_names ) [ ,(column_names ... ]
                       | ALL [ PRIVILEGES ] ( column_names ) }  ON 
                     [ TABLE ] table_name [ , ... ] FROM 
                     { [ GROUP ] role_name | PUBLIC } [ , ... ] 
                     [ CASCADE | RESTRICT ]

REVOKEGRANTOPTIONFORSELECTINSERTUPDATEREFERENCES(column_names),(column_names)ALLPRIVILEGES(column_names)ONTABLE,table_nameFROM,GROUProle_namePUBLICCASCADERESTRICT

revoke_seq

revoke_seq ::= REVOKE [ GRANT OPTION FOR ] 
               { { USAGE | SELECT | UPDATE } [ , ... ]
                 | ALL [ PRIVILEGES ] }  ON 
               { SEQUENCE sequence_name [ , ... ]
                 | ALL SEQUENCES IN SCHEMA schema_name [ , ... ] }  
               FROM { [ GROUP ] role_name | PUBLIC } [ , ... ] 
               [ CASCADE | RESTRICT ]

REVOKEGRANTOPTIONFOR,USAGESELECTUPDATEALLPRIVILEGESONSEQUENCE,sequence_nameALLSEQUENCESINSCHEMA,schema_nameFROM,GROUProle_namePUBLICCASCADERESTRICT

revoke_db

revoke_db ::= REVOKE [ GRANT OPTION FOR ] 
              { { CREATE | CONNECT | TEMPORARY | TEMP } [ , ... ]
                | ALL [ PRIVILEGES ] } ON DATABASE database_name 
              [ , ... ]  FROM { [ GROUP ] role_name | PUBLIC } 
              [ , ... ] [ CASCADE | RESTRICT ]

REVOKEGRANTOPTIONFOR,CREATECONNECTTEMPORARYTEMPALLPRIVILEGESONDATABASE,database_nameFROM,GROUProle_namePUBLICCASCADERESTRICT

revoke_domain

revoke_domain ::= REVOKE [ GRANT OPTION FOR ] 
                  { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN domain_name 
                  [ , ... ]  FROM { [ GROUP ] role_name | PUBLIC } 
                  [ , ... ] [ CASCADE | RESTRICT ]

REVOKEGRANTOPTIONFORUSAGEALLPRIVILEGESONDOMAIN,domain_nameFROM,GROUProle_namePUBLICCASCADERESTRICT

revoke_schema

revoke_schema ::= REVOKE [ GRANT OPTION FOR ] 
                  { { CREATE | USAGE } [ , ... ]
                    | ALL [ PRIVILEGES ] } ON SCHEMA schema_name 
                  [ , ... ]  FROM { [ GROUP ] role_name | PUBLIC } 
                  [ , ... ] [ CASCADE | RESTRICT ]

REVOKEGRANTOPTIONFOR,CREATEUSAGEALLPRIVILEGESONSCHEMA,schema_nameFROM,GROUProle_namePUBLICCASCADERESTRICT

revoke_type

revoke_type ::= REVOKE [ GRANT OPTION FOR ] 
                { USAGE | ALL [ PRIVILEGES ] } ON TYPE type_name 
                [ , ... ]  FROM { [ GROUP ] role_name | PUBLIC } 
                [ , ... ] [ CASCADE | RESTRICT ]

REVOKEGRANTOPTIONFORUSAGEALLPRIVILEGESONTYPE,type_nameFROM,GROUProle_namePUBLICCASCADERESTRICT

revoke_role

revoke_role ::= REVOKE [ ADMIN OPTION FOR ] role_name [ , ... ] FROM 
                role_name [ , ... ] [ CASCADE | RESTRICT ]

REVOKEADMINOPTIONFOR,role_nameFROM,role_nameCASCADERESTRICT

rollback

rollback ::= ROLLBACK [ TRANSACTION | WORK ]

ROLLBACKTRANSACTIONWORK

select

select ::= [ with_clause ] SELECT select_list 
           [ trailing_select_clauses ]

with_clauseSELECTselect_listtrailing_select_clauses

with_clause

with_clause ::= WITH [ RECURSIVE ] 
                { common_table_expression [ , ... ] }

WITHRECURSIVE,common_table_expression

select_list

select_list ::= [ ALL | DISTINCT [ ON { ( expression [ , ... ] ) } ] ] 
                 [ * | { { expression
                           | fn_over_window
                           | ordinary_aggregate_fn_invocation
                           | within_group_aggregate_fn_invocation } 
                       [ [ AS ] name ] } [ , ... ] ]

ALLDISTINCTON(,expression)*,expressionfn_over_windowordinary_aggregate_fn_invocationwithin_group_aggregate_fn_invocationASname

trailing_select_clauses

trailing_select_clauses ::= [ FROM { from_item [ , ... ] } ]  
                            [ WHERE boolean_expression ]  
                            [ GROUP BY { grouping_element [ , ... ] } ] 
                             [ HAVING boolean_expression ]  
                            [ WINDOW 
                              { { name AS window_definition } 
                              [ , ... ] } ]  
                            [ { UNION | INTERSECT | EXCEPT } 
                              [ ALL | DISTINCT ] select ]  
                            [ ORDER BY { order_expr [ , ... ] } ]  
                            [ LIMIT { int_expression | ALL } ]  
                            [ OFFSET int_expression [ ROW | ROWS ] ]  
                            [ FETCH { FIRST | NEXT } int_expression 
                              { ROW | ROWS } ONLY ]  
                            [ FOR { UPDATE
                                    | NO KEY UPDATE
                                    | SHARE
                                    | KEY SHARE } 
                              [ OF table_name [ , ... ] ] 
                              [ NOWAIT | SKIP LOCKED ] [ ... ] ]

FROM,from_itemWHEREboolean_expressionGROUPBY,grouping_elementHAVINGboolean_expressionWINDOW,nameASwindow_definitionUNIONINTERSECTEXCEPTALLDISTINCTselectORDERBY,order_exprLIMITint_expressionALLOFFSETint_expressionROWROWSFETCHFIRSTNEXTint_expressionROWROWSONLYFORUPDATENO KEY UPDATESHAREKEY SHAREOF,table_nameNOWAITSKIP LOCKED

from_item

from_item ::= '<See https://www.postgresql.org/docs/11/sql-select.html>'

<See https://www.postgresql.org/docs/11/sql-select.html>

common_table_expression

common_table_expression ::= cte_name [ ( column_name [ , ... ] ) ] AS 
                            ( { select
                                | values
                                | insert
                                | update
                                | delete } )

cte_name(,column_name)AS(selectvaluesinsertupdatedelete)

select_expression

select_expression ::= expression [ [ AS ] name ]

expressionASname

order_expr

order_expr ::= expression [ ASC | DESC | USING operator_name ] 
               [ NULLS { FIRST | LAST } ]

expressionASCDESCUSINGoperator_nameNULLSFIRSTLAST

set

set ::= SET [ SESSION | LOCAL ] { run_time_parameter { TO | = } 
                                  { value | DEFAULT }
                                  | TIME ZONE 
                                    { timezone | LOCAL | DEFAULT } }

SETSESSIONLOCALrun_time_parameterTO=valueDEFAULTTIMEZONEtimezoneLOCALDEFAULT

timezone

timezone ::= text_literal

text_literal

set_constraints

set_constraints ::= SET CONSTRAINTS { ALL | name [ , ... ] } 
                    { DEFERRED | IMMEDIATE }

SETCONSTRAINTSALL,nameDEFERREDIMMEDIATE

set_role

set_role ::= SET [ SESSION | LOCAL ] ROLE { role_name | NONE }

SETSESSIONLOCALROLErole_nameNONE

set_session_authorization

set_session_authorization ::= SET [ SESSION | LOCAL ] SESSION 
                              AUTHORIZATION { role_name | DEFAULT }

SETSESSIONLOCALSESSIONAUTHORIZATIONrole_nameDEFAULT

set_transaction

set_transaction ::= SET TRANSACTION transaction_mode [ ... ]

SETTRANSACTIONtransaction_mode

transaction_mode

transaction_mode ::= isolation_level
                     | read_write_mode
                     | deferrable_mode

isolation_levelread_write_modedeferrable_mode

isolation_level

isolation_level ::= ISOLATION LEVEL { READ UNCOMMITTED
                                      | READ COMMITTED
                                      | REPEATABLE READ
                                      | SERIALIZABLE }

ISOLATIONLEVELREADUNCOMMITTEDREADCOMMITTEDREPEATABLEREADSERIALIZABLE

read_write_mode

read_write_mode ::= READ ONLY | READ WRITE

READONLYREADWRITE

deferrable_mode

deferrable_mode ::= [ NOT ] DEFERRABLE

NOTDEFERRABLE

show_stmt

show_stmt ::= SHOW { run_time_parameter | ALL }

SHOWrun_time_parameterALL

show_transaction

show_transaction ::= SHOW TRANSACTION ISOLATION LEVEL

SHOWTRANSACTIONISOLATIONLEVEL

start_transaction

start_transaction ::= START TRANSACTION [ transaction_mode [ ... ] ]

STARTTRANSACTIONtransaction_mode

truncate

truncate ::= TRUNCATE [ TABLE ] { table_expr [ , ... ] } 
             [ CASCADE | RESTRICT ]

TRUNCATETABLE,table_exprCASCADERESTRICT

table_expr

table_expr ::= [ ONLY ] table_name [ * ]

ONLYtable_name*

update

update ::= [ with_clause ]  UPDATE table_expr [ [ AS ] alias ]  SET 
           update_item [ , ... ] [ WHERE boolean_expression
                                   | WHERE CURRENT OF cursor_name ]  
           [ returning_clause ]

with_clauseUPDATEtable_exprASaliasSET,update_itemWHEREboolean_expressionWHERECURRENTOFcursor_namereturning_clause

update_item

update_item ::= column_name = column_value
                | ( column_names ) = [ ROW ] ( column_values )
                | ( column_names ) = subquery

column_name=column_value(column_names)=ROW(column_values)(column_names)=subquery

column_value

column_value ::= expression | DEFAULT

expressionDEFAULT

values

values ::= VALUES ( expression_list ) [ ,(expression_list ... ]  
           [ ORDER BY { order_expr [ , ... ] } ]  
           [ LIMIT { int_expression | ALL } ]  
           [ OFFSET int_expression [ ROW | ROWS ] ]  
           [ FETCH { FIRST | NEXT } int_expression { ROW | ROWS } ONLY ]

VALUES(expression_list),(expression_list)ORDERBY,order_exprLIMITint_expressionALLOFFSETint_expressionROWROWSFETCHFIRSTNEXTint_expressionROWROWSONLY

expression_list

expression_list ::= expression [ , ... ]

,expression

select_start

select_start ::= SELECT [ ALL | 
                          DISTINCT [ ON { ( expression [ , ... ] ) } ] ] 
                  [ * | { { expression
                            | fn_over_window
                            | ordinary_aggregate_fn_invocation
                            | within_group_aggregate_fn_invocation } 
                        [ [ AS ] name ] } [ , ... ] ]

SELECTALLDISTINCTON(,expression)*,expressionfn_over_windowordinary_aggregate_fn_invocationwithin_group_aggregate_fn_invocationASname

fn_over_window

fn_over_window ::= name  ( [ expression [ , ... ] | * ]  
                   [ FILTER ( WHERE boolean_expression ) ] OVER 
                   { window_definition | name }

name(,expression*FILTER(WHEREboolean_expression)OVERwindow_definitionname

ordinary_aggregate_fn_invocation

ordinary_aggregate_fn_invocation ::= name  ( 
                                     { [ ALL | DISTINCT ] expression 
                                       [ , ... ]
                                       | * } 
                                     [ ORDER BY order_expr [ , ... ] ] 
                                     )  [ FILTER ( WHERE 
                                          boolean_expression ) ]

name(ALLDISTINCT,expression*ORDERBY,order_expr)FILTER(WHEREboolean_expression)

within_group_aggregate_fn_invocation

within_group_aggregate_fn_invocation ::= name  ( 
                                         { expression [ , ... ] } )  
                                         WITHIN GROUP ( ORDER BY 
                                         order_expr [ , ... ] )  
                                         [ FILTER ( WHERE 
                                           boolean_expression ) ]

name(,expression)WITHINGROUP(ORDERBY,order_expr)FILTER(WHEREboolean_expression)

window_clause

window_clause ::= WINDOW { { name AS window_definition } [ , ... ] }

WINDOW,nameASwindow_definition

window_definition

window_definition ::= ( [ name ]  
                      [ PARTITION BY order_expr [ , ... ] ]  
                      [ ORDER BY order_expr [ , ... ] ]  
                      [ frame_clause ] )

(namePARTITIONBY,order_exprORDERBY,order_exprframe_clause)

frame_clause

frame_clause ::= [ { RANGE | ROWS | GROUPS } frame_bounds ] 
                 [ frame_exclusion ]

RANGEROWSGROUPSframe_boundsframe_exclusion

frame_bounds

frame_bounds ::= frame_start | BETWEEN frame_start AND frame_end

frame_startBETWEENframe_startANDframe_end

frame_start

frame_start ::= frame_bound

frame_bound

frame_end

frame_end ::= frame_bound

frame_bound

frame_bound

frame_bound ::= UNBOUNDED PRECEDING
                | offset PRECEDING
                | CURRENT ROW
                | offset FOLLOWING
                | UNBOUNDED FOLLOWING

UNBOUNDEDPRECEDINGoffsetPRECEDINGCURRENTROWoffsetFOLLOWINGUNBOUNDEDFOLLOWING

frame_exclusion

frame_exclusion ::= EXCLUDE CURRENT ROW
                    | EXCLUDE GROUP
                    | EXCLUDE TIES
                    | EXCLUDE NO OTHERS

EXCLUDECURRENTROWEXCLUDEGROUPEXCLUDETIESEXCLUDENOOTHERS

offset

offset ::= int_expression | numeric_expression | interval_expression

int_expressionnumeric_expressioninterval_expression

group_by_clause

group_by_clause ::= GROUP BY { grouping_element [ , ... ] }

GROUPBY,grouping_element

grouping_element

grouping_element ::= ( ) | ( expression [ , ... ] )
                     | ROLLUP ( expression [ , ... ] )
                     | CUBE ( expression [ , ... ] )
                     | GROUPING SETS ( grouping_element [ , ... ] )

()(,expression)ROLLUP(,expression)CUBE(,expression)GROUPINGSETS(,grouping_element)

having_clause

having_clause ::= HAVING boolean_expression

HAVINGboolean_expression

qualified_name

qualified_name ::= name [ . ... ]

.name

role_name

role_name ::= name

name

database_name

database_name ::= name

name

schema_name

schema_name ::= name

name

table_name

table_name ::= qualified_name

qualified_name

cte_name

cte_name ::= name

name

column_name

column_name ::= name

name

object_name

object_name ::= name

name

access_method_name

access_method_name ::= name

name

relation_name

relation_name ::= qualified_name

qualified_name

aggregate_name

aggregate_name ::= qualified_name

qualified_name

constraint_name

constraint_name ::= qualified_name

qualified_name

operator_name

operator_name ::= qualified_name

qualified_name

policy_name

policy_name ::= qualified_name

qualified_name

subprogram_name

subprogram_name ::= qualified_name

qualified_name

rule_name

rule_name ::= qualified_name

qualified_name

trigger_name

trigger_name ::= qualified_name

qualified_name

sql_stmt

sql_stmt ::= '<SQL Statement>'

<SQL Statement>

domain_name

domain_name ::= qualified_name

qualified_name

index_method

index_method ::= text_literal

text_literal

arg_mode

arg_mode ::= IN | OUT | INOUT | VARIADIC

INOUTINOUTVARIADIC

formal_arg

formal_arg ::= name

name

arg_type

arg_type ::= type_name

type_name

text_literal

text_literal ::= '<Text Literal>'

<Text Literal>

int_literal

int_literal ::= '<Integer Literal>'

<Integer Literal>

positive_int_literal

positive_int_literal ::= '<Positive Integer Literal>'

<Positive Integer Literal>

non_neg_int_literal

non_neg_int_literal ::= '<Non-negative Integer Literal>'

<Non-negative Integer Literal>

numeric_literal

numeric_literal ::= '<Numeric Literal>'

<Numeric Literal>

value

value ::= text_literal | numeric_literal | boolean

text_literalnumeric_literalboolean

run_time_parameter

run_time_parameter ::= text_literal

text_literal

large_object_oid

large_object_oid ::= int_literal

int_literal

left_type

left_type ::= qualified_name | NONE

qualified_nameNONE

right_type

right_type ::= qualified_name | NONE

qualified_nameNONE

name

name ::= '<Text Literal as specified in [Names and identifiers](../../names-and-identifiers/)>'

<Text Literal as specified in Names and identifiers>

column_names

column_names ::= column_name [ , ... ]

,column_name

boolean_expression

boolean_expression ::= expression

expression

int_expression

int_expression ::= expression

expression

numeric_expression

numeric_expression ::= expression

expression

text_expression

text_expression ::= expression

expression

array_expression

array_expression ::= expression

expression

interval_expression

interval_expression ::= expression

expression

expression

expression ::= '<expression>'

<expression>

boolean

boolean ::= TRUE | FALSE

TRUEFALSE

collation

collation ::= '"default"' | "C" | "POSIX" | '"ucs_basic"'

"default""C""POSIX""ucs_basic"

type_name

type_name ::= qualified_name

qualified_name

attribute_name

attribute_name ::= name

name

data_type

data_type ::= type_name

type_name

subtype

subtype ::= type_name

type_name

operator_class_name

operator_class_name ::= qualified_name

qualified_name

subtype_operator_class

subtype_operator_class ::= operator_class_name

operator_class_name

canonical_function

canonical_function ::= subprogram_name

subprogram_name

subtype_diff_function

subtype_diff_function ::= subprogram_name

subprogram_name

input_function

input_function ::= subprogram_name

subprogram_name

output_function

output_function ::= subprogram_name

subprogram_name

receive_function

receive_function ::= subprogram_name

subprogram_name

send_function

send_function ::= subprogram_name

subprogram_name

type_modifier_input_function

type_modifier_input_function ::= subprogram_name

subprogram_name

type_modifier_output_function

type_modifier_output_function ::= subprogram_name

subprogram_name

internallength

internallength ::= -2 | -1 | non_neg_int_literal

-2-1non_neg_int_literal

alignment

alignment ::= CHAR | INT2 | INT4 | DOUBLE

CHARINT2INT4DOUBLE

storage

storage ::= PLAIN | EXTERNAL | EXTENDED | MAIN

PLAINEXTERNALEXTENDEDMAIN

like_type

like_type ::= type_name

type_name

category

category ::= '<character>'

<character>

default_type_value

default_type_value ::= '<default value for the type instance>'

<default value for the type instance>

element

element ::= type_name

type_name

delimiter

delimiter ::= '<character>'

<character>

param_name

param_name ::= text_literal

text_literal

param_value

param_value ::= text_literal

text_literal

code

code ::= text_literal

text_literal

aggregate_arg_mode

aggregate_arg_mode ::= IN | VARIADIC

INVARIADIC

sfunc

sfunc ::= subprogram_name

subprogram_name

state_data_type

state_data_type ::= type_name

type_name

base_type

base_type ::= type_name

type_name

state_data_size

state_data_size ::= non_neg_int_literal

non_neg_int_literal

ffunc

ffunc ::= subprogram_name

subprogram_name

combinefunc

combinefunc ::= subprogram_name

subprogram_name

serialfunc

serialfunc ::= subprogram_name

subprogram_name

deserialfunc

deserialfunc ::= subprogram_name

subprogram_name

initial_condition

initial_condition ::= text_literal

text_literal

msfunc

msfunc ::= subprogram_name

subprogram_name

minvfunc

minvfunc ::= subprogram_name

subprogram_name

mstate_data_type

mstate_data_type ::= type_name

type_name

mstate_data_size

mstate_data_size ::= non_neg_int_literal

non_neg_int_literal

mffunc

mffunc ::= subprogram_name

subprogram_name

minitial_condition

minitial_condition ::= text_literal

text_literal

sort_operator

sort_operator ::= operator_name

operator_name

source_type

source_type ::= type_name

type_name

target_type

target_type ::= type_name

type_name

com_op

com_op ::= operator_name

operator_name

neg_op

neg_op ::= operator_name

operator_name

res_proc

res_proc ::= subprogram_name

subprogram_name

join_proc

join_proc ::= subprogram_name

subprogram_name

strategy_number

strategy_number ::= positive_int_literal

positive_int_literal

support_number

support_number ::= positive_int_literal

positive_int_literal

op_type

op_type ::= data_type

data_type

storage_type

storage_type ::= data_type

data_type

using_expression

using_expression ::= expression

expression

check_expression

check_expression ::= expression

expression

new_name

new_name ::= name

name

version

version ::= text_literal

text_literal

extension_name

extension_name ::= name

name

matview_name

matview_name ::= qualified_name

qualified_name

new_owner

new_owner ::= name

name

fdw_options

fdw_options ::= option_and_name_value [ , ... ]

,option_and_name_value

option_and_name_value

option_and_name_value ::= option_name option_value

option_nameoption_value

alter_fdw_options

alter_fdw_options ::= alter_option_and_name_value [ , ... ]

,alter_option_and_name_value

alter_option_and_name_value

alter_option_and_name_value ::= { ADD | SET | DROP } 
                                option_and_name_value

ADDSETDROPoption_and_name_value

fdw_name

fdw_name ::= text_literal

text_literal

handler_name

handler_name ::= text_literal

text_literal

validator_name

validator_name ::= '<DateTime Literal>'

<DateTime Literal>

option_name

option_name ::= text_literal

text_literal

option_value

option_value ::= text_literal

text_literal

savepoint_create

savepoint_create ::= SAVEPOINT name

SAVEPOINTname

savepoint_release

savepoint_release ::= RELEASE [ SAVEPOINT ] name

RELEASESAVEPOINTname

savepoint_rollback

savepoint_rollback ::= ROLLBACK [ WORK | TRANSACTION ] TO 
                       [ SAVEPOINT ] name

ROLLBACKWORKTRANSACTIONTOSAVEPOINTname

plpgsql_block_stmt

plpgsql_block_stmt ::= [ << label >> ]  
                       [ plpgsql_declaration_section ]  
                       plpgsql_executable_section  
                       [ plpgsql_exception_section ] END [ label ] ;

<<label>>plpgsql_declaration_sectionplpgsql_executable_sectionplpgsql_exception_sectionENDlabel;

label

label ::= name

name

plpgsql_declaration_section

plpgsql_declaration_section ::= DECLARE 
                                [ plpgsql_declaration [ ... ] ]

DECLAREplpgsql_declaration

plpgsql_declaration

plpgsql_declaration ::= plpgsql_regular_declaration
                        | plpgsql_bound_refcursor_declaration

plpgsql_regular_declarationplpgsql_bound_refcursor_declaration

plpgsql_regular_declaration

plpgsql_regular_declaration ::= [ variable ] [ CONSTANT ] 
                                [ data_type ] [ NOT NULL ] 
                                [ := expression ] ;

variableCONSTANTdata_typeNOTNULL:=expression;

variable

variable ::= name

name

plpgsql_bound_refcursor_declaration

plpgsql_bound_refcursor_declaration ::= plpgsql_bound_refcursor_name 
                                        [ [ NO ] SCROLL ]  CURSOR 
                                        [ ( plpgsql_cursor_arg 
                                          [ , ... ] ) ]  FOR subquery 
                                        ;

plpgsql_bound_refcursor_nameNOSCROLLCURSOR(,plpgsql_cursor_arg)FORsubquery;

plpgsql_cursor_arg

plpgsql_cursor_arg ::= formal_arg arg_type

formal_argarg_type

plpgsql_executable_section

plpgsql_executable_section ::= BEGIN 
                               [ plpgsql_executable_stmt [ ... ] ]

BEGINplpgsql_executable_stmt

plpgsql_executable_stmt

plpgsql_executable_stmt ::= plpgsql_basic_stmt | plpgsql_compound_stmt

plpgsql_basic_stmtplpgsql_compound_stmt

plpgsql_basic_stmt

plpgsql_basic_stmt ::= { NULL | plpgsql_assert_stmt
                         | plpgsql_assignment_stmt
                         | plpgsql_close_cursor_stmt
                         | plpgsql_continue_stmt
                         | plpgsql_dynamic_sql_stmt
                         | plpgsql_exit_stmt
                         | plpgsql_fetch_from_cursor_stmt
                         | plpgsql_get_diagnostics_stmt
                         | plpgsql_get_stacked_diagnostics_stmt
                         | plpgsql_move_in_cursor_stmt
                         | plpgsql_open_cursor_stmt
                         | plpgsql_perform_stmt
                         | plpgsql_raise_stmt
                         | plpgsql_return_stmt
                         | plpgsql_static_bare_sql_stmt
                         | plpgsql_static_dml_returning_stmt
                         | plpgsql_static_select_into_stmt } ;

NULLplpgsql_assert_stmtplpgsql_assignment_stmtplpgsql_close_cursor_stmtplpgsql_continue_stmtplpgsql_dynamic_sql_stmtplpgsql_exit_stmtplpgsql_fetch_from_cursor_stmtplpgsql_get_diagnostics_stmtplpgsql_get_stacked_diagnostics_stmtplpgsql_move_in_cursor_stmtplpgsql_open_cursor_stmtplpgsql_perform_stmtplpgsql_raise_stmtplpgsql_return_stmtplpgsql_static_bare_sql_stmtplpgsql_static_dml_returning_stmtplpgsql_static_select_into_stmt;

plpgsql_assert_stmt

plpgsql_assert_stmt ::= ASSERT boolean_expression 
                        [ , text_expression ]

ASSERTboolean_expression,text_expression

plpgsql_assignment_stmt

plpgsql_assignment_stmt ::= { variable | formal_arg } := expression

variableformal_arg:=expression

plpgsql_dynamic_sql_stmt

plpgsql_dynamic_sql_stmt ::= EXECUTE text_expression 
                             [ INTO [ STRICT ] plpgsql_into_target 
                               [ , ... ] ] 
                             [ USING expression [ , ... ] ]

EXECUTEtext_expressionINTOSTRICT,plpgsql_into_targetUSING,expression

plpgsql_get_diagnostics_stmt

plpgsql_get_diagnostics_stmt ::= GET [ CURRENT ] DIAGNOSTICS 
                                 plpgsql_diagnostics_item [ , ... ]

GETCURRENTDIAGNOSTICS,plpgsql_diagnostics_item

plpgsql_diagnostics_item

plpgsql_diagnostics_item ::= { variable | formal_arg } { := | = } 
                             plpgsql_diagnostics_item_name

variableformal_arg:==plpgsql_diagnostics_item_name

plpgsql_diagnostics_item_name

plpgsql_diagnostics_item_name ::= PG_CONTEXT | ROW_COUNT | RESULT_OID

PG_CONTEXTROW_COUNTRESULT_OID

plpgsql_get_stacked_diagnostics_stmt

plpgsql_get_stacked_diagnostics_stmt ::= GET STACKED DIAGNOSTICS 
                                         plpgsql_stacked_diagnostics_item 
                                         [ , ... ]

GETSTACKEDDIAGNOSTICS,plpgsql_stacked_diagnostics_item

plpgsql_stacked_diagnostics_item

plpgsql_stacked_diagnostics_item ::= { variable | formal_arg } 
                                     { := | = } 
                                     plpgsql_stacked_diagnostics_item_name

variableformal_arg:==plpgsql_stacked_diagnostics_item_name

plpgsql_stacked_diagnostics_item_name

plpgsql_stacked_diagnostics_item_name ::= RETURNED_SQLSTATE
                                          | MESSAGE_TEXT
                                          | PG_EXCEPTION_DETAIL
                                          | PG_EXCEPTION_HINT
                                          | SCHEMA_NAME
                                          | TABLE_NAME
                                          | COLUMN_NAME
                                          | PG_DATATYPE_NAME
                                          | CONSTRAINT_NAME
                                          | PG_EXCEPTION_CONTEXT

RETURNED_SQLSTATEMESSAGE_TEXTPG_EXCEPTION_DETAILPG_EXCEPTION_HINTSCHEMA_NAMETABLE_NAMECOLUMN_NAMEPG_DATATYPE_NAMECONSTRAINT_NAMEPG_EXCEPTION_CONTEXT

plpgsql_raise_stmt

plpgsql_raise_stmt ::= RAISE [ plpgsql_raise_level ] 
                       [ plpgsql_raise_shortcut_for_exception_or_message ] 
                        [ USING plpgsql_raise_using_item [ , ... ] ]

RAISEplpgsql_raise_levelplpgsql_raise_shortcut_for_exception_or_messageUSING,plpgsql_raise_using_item

plpgsql_raise_level

plpgsql_raise_level ::= DEBUG
                        | LOG
                        | NOTICE
                        | WARNING
                        | EXCEPTION
                        | INFO

DEBUGLOGNOTICEWARNINGEXCEPTIONINFO

plpgsql_raise_shortcut_for_exception_or_message

plpgsql_raise_shortcut_for_exception_or_message ::= SQLSTATE 
                                                    errcode_literal
                                                    | exception_name
                                                    | message_literal 
                                                      [ text_expression 
                                                        [ , ... ] ]

SQLSTATEerrcode_literalexception_namemessage_literal,text_expression

errcode_literal

errcode_literal ::= text_literal

text_literal

exception_name

exception_name ::= name

name

message_literal

message_literal ::= text_literal

text_literal

plpgsql_raise_using_item

plpgsql_raise_using_item ::= { ERRCODE
                               | MESSAGE
                               | DETAIL
                               | HINT
                               | SCHEMA
                               | TABLE
                               | COLUMN
                               | DATATYPE
                               | CONSTRAINT } { := | = } 
                             text_expression

ERRCODEMESSAGEDETAILHINTSCHEMATABLECOLUMNDATATYPECONSTRAINT:==text_expression

plpgsql_static_bare_sql_stmt

plpgsql_static_bare_sql_stmt ::= sql_stmt

sql_stmt

plpgsql_static_dml_returning_stmt

plpgsql_static_dml_returning_stmt ::= { insert | update | delete } 
                                      returning_clause INTO [ STRICT ] 
                                      plpgsql_into_target [ , ... ]

insertupdatedeletereturning_clauseINTOSTRICT,plpgsql_into_target

plpgsql_static_select_into_stmt

plpgsql_static_select_into_stmt ::= [ with_clause ] SELECT select_list 
                                    INTO [ STRICT ] 
                                    plpgsql_into_target [ , ... ] 
                                    [ trailing_select_clauses ]

with_clauseSELECTselect_listINTOSTRICT,plpgsql_into_targettrailing_select_clauses

plpgsql_into_target

plpgsql_into_target ::= variable | formal_arg

variableformal_arg

plpgsql_open_cursor_stmt

plpgsql_open_cursor_stmt ::= OPEN plpgsql_refcursor_name 
                             [ [ NO ] SCROLL ] FOR subquery

OPENplpgsql_refcursor_nameNOSCROLLFORsubquery

plpgsql_fetch_from_cursor_stmt

plpgsql_fetch_from_cursor_stmt ::= FETCH 
                                   { FIRST
                                     | LAST
                                     | ABSOLUTE int_literal
                                     | NEXT
                                     | FORWARD
                                     | PRIOR
                                     | BACKWARD
                                     | RELATIVE int_literal }  
                                   [ FROM | IN ] name INTO 
                                   plpgsql_into_target [ , ... ]

FETCHFIRSTLASTABSOLUTEint_literalNEXTFORWARDPRIORBACKWARDRELATIVEint_literalFROMINnameINTO,plpgsql_into_target

plpgsql_move_in_cursor_stmt

plpgsql_move_in_cursor_stmt ::= MOVE [ move_to_one_row
                                       | move_over_many_rows ] 
                                [ FROM | IN ] plpgsql_refcursor_name

MOVEmove_to_one_rowmove_over_many_rowsFROMINplpgsql_refcursor_name

plpgsql_close_cursor_stmt

plpgsql_close_cursor_stmt ::= CLOSE plpgsql_refcursor_name

CLOSEplpgsql_refcursor_name

plpgsql_refcursor_name

plpgsql_refcursor_name ::= name

name

plpgsql_perform_stmt

plpgsql_perform_stmt ::= PERFORM { select_list 
                                   [ trailing_select_clauses ]
                                   | ( select ) }

PERFORMselect_listtrailing_select_clauses(select)

plpgsql_return_stmt

plpgsql_return_stmt ::= RETURN [ expression
                                 | NEXT
                                 | NEW
                                 | OLD
                                 | NULL ]

RETURNexpressionNEXTNEWOLDNULL

plpgsql_compound_stmt

plpgsql_compound_stmt ::= { plpgsql_block_stmt
                            | plpgsql_loop_stmt
                            | plpgsql_if_stmt
                            | plpgsql_case_stmt } ;

plpgsql_block_stmtplpgsql_loop_stmtplpgsql_if_stmtplpgsql_case_stmt;

plpgsql_loop_stmt

plpgsql_loop_stmt ::= [ << label >> ] { plpgsql_unbounded_loop_defn
                                        | plpgsql_bounded_loop_defn } 
                      LOOP  [ plpgsql_executable_stmt [ , ... ] ]  
                      END LOOP [ label ]

<<label>>plpgsql_unbounded_loop_defnplpgsql_bounded_loop_defnLOOP,plpgsql_executable_stmtEND LOOPlabel

plpgsql_unbounded_loop_defn

plpgsql_unbounded_loop_defn ::= [ WHILE boolean_expression ]

WHILEboolean_expression

plpgsql_bounded_loop_defn

plpgsql_bounded_loop_defn ::= plpgsql_integer_for_loop_defn
                              | plpgsql_array_foreach_loop_defn
                              | plpgsql_query_for_loop_defn

plpgsql_integer_for_loop_defnplpgsql_array_foreach_loop_defnplpgsql_query_for_loop_defn

plpgsql_integer_for_loop_defn

plpgsql_integer_for_loop_defn ::= FOR variable IN  [ REVERSE ] 
                                  int_expression .. int_expression  
                                  [ BY int_expression ]

FORvariableINREVERSEint_expression..int_expressionBYint_expression

plpgsql_array_foreach_loop_defn

plpgsql_array_foreach_loop_defn ::= FOREACH variable  
                                    [ SLICE int_literal ] IN ARRAY 
                                    array_expression

FOREACHvariableSLICEint_literalINARRAYarray_expression

plpgsql_query_for_loop_defn

plpgsql_query_for_loop_defn ::= FOR variable [ variable [ , ... ] ] IN 
                                 { subquery
                                   | plpgsql_bound_refcursor_name
                                   | plpgsql_dynamic_subquery }

FORvariable,variableINsubqueryplpgsql_bound_refcursor_nameplpgsql_dynamic_subquery

plpgsql_bound_refcursor_name

plpgsql_bound_refcursor_name ::= plpgsql_refcursor_name

plpgsql_refcursor_name

plpgsql_dynamic_subquery

plpgsql_dynamic_subquery ::= EXECUTE text_expression 
                             [ USING expression [ , ... ] ]

EXECUTEtext_expressionUSING,expression

plpgsql_exit_stmt

plpgsql_exit_stmt ::= EXIT [ label ] [ WHEN boolean_expression ]

EXITlabelWHENboolean_expression

plpgsql_continue_stmt

plpgsql_continue_stmt ::= CONTINUE [ label ] 
                          [ WHEN boolean_expression ]

CONTINUElabelWHENboolean_expression

plpgsql_if_stmt

plpgsql_if_stmt ::= IF guard_expression THEN 
                    [ plpgsql_executable_stmt [ ... ] ]  
                    [ plpgsql_elsif_leg [ ... ] ]  
                    [ ELSE [ plpgsql_executable_stmt [ ... ] ] ]  END 
                    IF

IFguard_expressionTHENplpgsql_executable_stmtplpgsql_elsif_legELSEplpgsql_executable_stmtENDIF

plpgsql_elsif_leg

plpgsql_elsif_leg ::= { ELSIF | ELSEIF } guard_expression THEN 
                      [ plpgsql_executable_stmt [ ... ] ]

ELSIFELSEIFguard_expressionTHENplpgsql_executable_stmt

guard_expression

guard_expression ::= boolean_expression

boolean_expression

plpgsql_case_stmt

plpgsql_case_stmt ::= plpgsql_searched_case_stmt
                      | plpgsql_simple_case_stmt

plpgsql_searched_case_stmtplpgsql_simple_case_stmt

plpgsql_searched_case_stmt

plpgsql_searched_case_stmt ::= CASE  plpgsql_searched_when_leg [ ... ] 
                                [ ELSE 
                                  [ plpgsql_executable_stmt [ ... ] ] ] 
                                END CASE

CASEplpgsql_searched_when_legELSEplpgsql_executable_stmtENDCASE

plpgsql_searched_when_leg

plpgsql_searched_when_leg ::= WHEN guard_expression THEN 
                              [ plpgsql_executable_stmt [ ... ] ]

WHENguard_expressionTHENplpgsql_executable_stmt

plpgsql_simple_case_stmt

plpgsql_simple_case_stmt ::= CASE target_expression  
                             plpgsql_simple_when_leg [ ... ]  
                             [ ELSE 
                               [ plpgsql_executable_stmt [ ... ] ] ]  
                             END CASE

CASEtarget_expressionplpgsql_simple_when_legELSEplpgsql_executable_stmtENDCASE

plpgsql_simple_when_leg

plpgsql_simple_when_leg ::= WHEN candidate_expression THEN 
                            [ plpgsql_executable_stmt [ ... ] ]

WHENcandidate_expressionTHENplpgsql_executable_stmt

target_expression

target_expression ::= expression

expression

candidate_expression

candidate_expression ::= expression

expression

plpgsql_exception_section

plpgsql_exception_section ::= EXCEPTION { plpgsql_handler [ ... ] }

EXCEPTIONplpgsql_handler

plpgsql_handler

plpgsql_handler ::= WHEN { plpgsql_handler_condition [ OR ... ] } THEN 
                    { plpgsql_executable_stmt [ ... ] }

WHENORplpgsql_handler_conditionTHENplpgsql_executable_stmt

plpgsql_handler_condition

plpgsql_handler_condition ::= SQLSTATE errcode_literal
                              | exception_name
                              | OTHERS

SQLSTATEerrcode_literalexception_nameOTHERS