The SQL Guide to Ingres Appendix A – Syntax of SQL

Rick F. van der Lans

Appendix A

Syntax of SQL

A.1 Introduction

In this appendix, we explain the notation method we have used to define the statements, the defini- tions of the SQL statements discussed in this book, and show the list of reserved words.

The definitions in this appendix can differ from those in the previous chapters. The main reason for this is that, in the chapters, we explained the statements and concepts step by step. To avoid too much detail, we sometimes used simple versions of the definitions. This appendix contains the com- plete definitions.

A.2 The BNF Notation

In this appendix and throughout the book, we have used a formal notation method to describe the syntax of all SQL statements and the common elements. This notation is a derivative of the so-called Backus Naur Form (BNF), which is named after John Backus and Peter Naur. The meaning of the metasymbols that we use is based on that of the metasymbols in the SQL standard.

BNF adopts a language of substitution rules or production rules, consisting of a series of symbols. Each production rule defines one symbol. A symbol could be, for example, an SQL statement, a ta- ble name or a colon. A terminal symbol is a special type of symbol. All symbols, apart from the ter- minal symbols, are defined in terms of other symbols in a production rule. Examples of terminal symbols are the term CREATE and the semicolon.

You can compare a production rule with the definition of an element, in which the definition of that element uses elements defined elsewhere. In this case, an element equates to a symbol. 4 | The SQL Guide to Ingres

The following metasymbols do not form part of the SQL language, but belong to the notation tech- nique:

• < > • ::= • | • [ ] • ... • { } • ; • "

We now explain each of these symbols.

The Symbols < and >

Nonterminal symbols are presented in angle brackets. A production rule exists for every non- terminal symbol. We show the names of the non-terminal symbols in lowercase letters. Two exam- ples of non-terminal symbols are | | DO ENDFOR

Grant Statement

::= | | | | |

::= GRANT

ON [ TABLE ]
[ ,
]... TO [ WITH GRANT OPTION ]

::= GRANT ON { DATABASE [ , ]... | CURRENT INSTALLATION } TO

::= GRANT [ , ]... TO

::= GRANT { ALL [ PRIVILEGES ] | NEXT } ON SEQUENCE [ , ]... TO [ WITH GRANT OPTION ]

::= GRANT { ALL [ PRIVILEGES ] | EXECUTE } ON PROCEDURE [ , ]... TO [ WITH GRANT OPTION ]

::= GRANT ON DBEVENT [ , ]... TO [ WITH GRANT OPTION ]

Appendix A Syntax of SQL | 29

If Statement

::= IF THEN [ ELSEIF THEN ]... [ ELSE ] ENDIF

Include Statement

::= INCLUDE

Inquire_sql Statement

::= { INQUIRE_SQL | INQUIRE_INGRES } ( [ , ]...

::= =

::= dbeventname | dbeventowner | dbeventdatabase | dbeventtime | dbeventtext

Insert Statement

::= INSERT INTO

::= [ ] | [ ]

30 | The SQL Guide to Ingres

Message Statement

::= MESSAGE { | | } [ WITH DESTINATION = ( [ , ]... ) ]

::= | |

::= | |

::= SESSION | ERROR_LOG | AUDIT_LOG

Modify Statement

::= MODIFY TO [ UNIQUE ] [ ON [ , ]... ] [ WITH [ , ]... ]

::=

| [ . ] |
PARTITION [ , ]...

::= ISAM | HASH | HEAP | HEAPSORT | BTREE | RECONSTRUCT | TRUNCATED | REORGANIZE | RELOCATE | MERGE | ADD_EXTEND | READONLY | NOREADONLY | PHYS_CONSISTENT | PHYS_INCONSISTENT | LOG_CONSISTENT | LOG_INCONSISTENT | TABLE_RECOVERY_ALLOWED | TABLE_RECOVERY_DISALLOWED | PERSISTENCE | NOPERSISTENCE | UNIQUE_SCOPE = { ROW | STATEMENT } | TABLE_DEBUG | PRIORITY =

Open Statement

::= OPEN

Appendix A Syntax of SQL | 31

Prepare Statement

::= PREPARE [ INTO [ USING NAMES ] ] FROM { | }

Prepare to Commit Statement

::= PREPARE TO COMMIT WITH HIGHXID = , LOWXID =

Raise Dbevent Statement

::= RAISE DBEVENT [ . ] [ WITH { SHARE | NOSHARE } ]

::=

Raise Error Statement

::= RAISE ERROR [ ] [ WITH DESTINATION = ( [ , ]... )

::= | |

::= | |

::= SESSION | ERROR_LOG | AUDIT_LOG

Register Dbevent Statement

::= REGISTER DBEVENT [ . ] 32 | The SQL Guide to Ingres

Register Table Statement

::= |

::= REGISTER [ TABLE ]

[ ] AS LINK { | WITH REFRESH }

::= FROM

[ WITH [ NODE = , DATABASE = ] [ , DBMS = ]

::= REGISTER TABLE

( [ , ]... ) AS IMPORT FROM ' ' WITH DBMS = SXA [ , ROWS = ]

::= [ ] [ IS ' ' ]

Remove Dbevent Statement

::= REMOVE DBEVENT [ . ]

Remove Table Statement

::= REMOVE [ TABLE ]

[ ,
]...

Return Statement

::= RETURN Appendix A Syntax of SQL | 33

Return Row Statement

::= RETURN ROW

Revoke Statement

::= | | | |

::= REVOKE [ GRANT OPTION FOR ]

ON [ TABLE ]
[ ,
]... FROM { CASCADE | RESTRICT }

::= REVOKE ON { DATABASE | CURRENT INSTALLATION } FROM [ CASCADE | RESTRICT ]

::= REVOKE [ , ]... FROM [ CASCADE | RESTRICT ]

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

::= REVOKE [ GRANT OPTION FOR ] { ALL [ PRIVILEGES ] | } ON DBEVENT [ , ]... FROM [ CASCADE | RESTRICT ]

Rollback Statement

::= ROLLBACK [ WORK ] [ TO ] 34 | The SQL Guide to Ingres

Save Statement

::= SAVE

[ UNTIL ]

::=

::= | JANUARY | JAN | FEBRUARY | FEB | MARCH | MAR | APRIL | APR | MAY | JUNE | JUN | JULY |JUL | AUGUST | AUG | SEPTEMBER | SEP | OCTOBER | OCT | NOVEMBER | NOV | DECEMBER | DEC

Savepoint Statement

::= SAVEPOINT

Select Statement

Select Into Statement

The cursor version for embedded SQL

[ ] [ ] [ [ ] ] [

] [ ::= [ REPEATED ]
] [ ::=
] [
} WHERE TIMEOUT = { | SESSION | SYSTEM | NOWAIT } continues Æ 36 | The SQL Guide to Ingres

::= SET SESSION

::= ADD PRIVILEGES ( ) | DROP PRIVILEGES ( ) | WITH PRIVILEGES = { ( ) | ALL | DEFAULT } | WITH NOPRIVILEGES

::= SET { SESSION | TRANSACTION } { READ ONLY | READ WRITE } [ , ISOLATION LEVEL ]

::= READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE

Set_sql Statement

::= SET_SQL ( SESSION = )

Update Statement

The version for interactive SQL

::= UPDATE

SET [ , ]... [ WHERE ]

::= =

The version for embedded SQL:

::= UPDATE

SET [ , ]... [ WHERE { | CURRENT OF } ]

::= = Appendix A Syntax of SQL | 37

Whenever Statement

::= WHENEVER

::= SQLWARNING | SQLERROR | SQLMESSAGE | NOT FOUND | DBEVENT

::= CONTINUE | GOTO

While Statement

::= [

A.4.3 Common Elements

This section contains the general common elements used in various SQL statements. The elements that are defined as a name are all grouped at the end of this section.

Note: All the reserved words, such as ALL, TABLE, and DATABASE can be specified in small letters and in capitals. In fact, they may be mixed. For example, the following three terms are all allowed TABLE, table, and TABle. In the definitions below, however, all the reserved words are specified in capitals.

::= COUNT ( [ DISTINCT | ALL ] { * | } ) | MIN ( [ DISTINCT | ALL ] ) | MAX ( [ DISTINCT | ALL ] ) | SUM ( [ DISTINCT | ALL ] ) | AVG ( [ DISTINCT | ALL ] ) | ANY ( [ DISTINCT | ALL ] ) | STDDEV_POP ( [ DISTINCT | ALL ] ) | STDDEV_SAMP ( [ DISTINCT | ALL ] ) | VAR_POP ( [ DISTINCT | ALL ] ) | VAR_SAMP ( [ DISTINCT | ALL ] )

::= [ TABLE ] [ . ]

| DATABASE | CURRENT INSTALLATION

38 | The SQL Guide to Ingres

::= CHAR [ ( ) ] | CHARACTER [ ( ) ] | VARCHAR ( ) | CHARACTER VARYING ( ) | LONG VARCHAR | CLOB | CHAR LARGE OBJECT | CHARACTER LARGE OBJECT | TEXT [ ( ) ] | VCHAR [ ( ) ] | [ ( ) ] | NCHAR [ ( ) ] | NVARCHAR [ ( ) ] | LONG NVARCHAR | NCLOB | NCHAR LARGE OBJECT | NATIONAL CHARACTER LARGE OBJECT

::= [ U& ]

::= UNIQUE

::= DATE ' - - '

::= { INTERVAL | interval } [ + | - ] ' '

::= { ALL | ANY | SOME }

::=

::= ALL_EVENTS | DEFAULT_EVENTS | QUERY_TEXT

::= ALARM | DATABASE | DBEVENT | LOCATION | PROCEDURE | ROLE | RULE | SECURITY | TABLE | USER | VIEW | LEVEL ( ' ' ) | ROW | QUERY_TEXT | RESOURCE Appendix A Syntax of SQL | 39

::= AUTOMATIC [ , ]...

::= PARTITION [ WITH LOCATION = ] | PARTITIONS [ WITH LOCATION = ]

::= BEGIN END

::= CASE [ ELSE ] END

::= CAST ( AS )

::= | | | ''

::= ' [ ... ] '

::= CHECK ( )

::= COLLATE { UNICODE | UNICODE_CASE_INSENSITIVE | SQL_CHARACTER }

::= [ ] [ ] [ ] [ ]

::= [ ASC | DESC ] 40 | The SQL Guide to Ingres

::= [ CONSTRAINT ] { PRIMARY KEY | UNIQUE | | } [ WITH [ , ]... ]

::= ( [ , ]... )

::= [

. ]

::= (

)

::= = | < | > | <= | >= | <> | !=

::= { | } { "||" | + } { | }

::= { + | - } | + | ( )

::= { + | - } | { + | - } | - | - | - | ( )

::= | Appendix A Syntax of SQL | 41

::= { "||" | + }

::= { + | - } | + | + | ( )

::= - | - | ( )

::= |

::= [ + | - ] | ( ) | { | } { | } | [ + | - ]

::= | | | | | |

::=

42 | The SQL Guide to Ingres

::= { + | - } | ( )

::= { + | - } | + | ( )

::= | OR | AND | ( ) | NOT

::= ON_ERROR = { TERMINATE | CONTINUE } | ERROR_COUNT = | ROLLBACK = { ENABLED | DISABLED } | LOG = | ALLOCATION = | EXTEND = | FILLFACTOR = | MINPAGES = | MAXPAGES = | LEAFFILL = | NONLEAFFILL = | ROW_ESTIMATE =

::= ALL [ PRIVILEGES ] | [ , ]... Appendix A Syntax of SQL | 43

::= ACCESS | NOACCESS | CREATE_PROCEDURE | NOCREATE_SEQUENCE | CREATE_SEQUENCE | NOCREATE_SEQUENCE | CREATE_TABLE | NOCREATE_TABLE | DB_ADMIN | NODB_ADMIN | LOCKMODE | NOLOCKMODE | QUERY_COST_LIMIT | NOQUERY_COST_LIMIT | QUERY_CPU_LIMIT | NOQUERY_CPU_LIMIT | QUERY_IO_LIMIT | NOQUERY_IO_LIMIT | QUERY_PAGE_LIMIT | NOQUERY_PAGE_LIMIT | QUERY_ROW_LIMIT | NOQUERY_ROW_LIMIT | UPDATE_SYSCAT | NOUPDATE_SYSCAT | SELECT_SYSCAT | NOSELECT_SYSCAT | CONNECT_TIME_LIMIT | NOCONNECT_TIME_LIMIT | IDLE_TIME_LIMIT | NOIDLE_TIME_LIMIT | SESSION_PRIORITY | NOSESSION_PRIORITY | TABLE_STATISTICS | NOTABLE_STATISTICS

::= | | | | |

::= ( [ , ]... ) 44 | The SQL Guide to Ingres

::= |

::=

::= [ ]

::= RAISE | REGISTER

:= [ , ]...

::= DECIMAL [ ( [ , ] ) ] | DEC [ ( [ , ] ) ] | NUMERIC [ ( [ , ] ) ]

::= [ + | - ] [ . ] | [ + | - ] . | [ + | - ] .

::= WITH DEFAULT | [ WITH ] DEFAULT { | } | NOT DEFAULT

::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

::=

::= | |

Appendix A Syntax of SQL | 45

::= Specification of a file according to the rules of the .

::= FIRST

::= FLOAT [ ( ) ] | FLOAT4 | REAL | FLOAT8 | F | DOUBLE PRECISION

::= { E | e }

::= | | |

::= FOR [ DEFERRED | DIRECT ] UPDATE [ OF [ , ]... ]

::= FOREIGN KEY

::= FROM

[ ,
]...

::= PUBLIC | [ USER ] [ , ]... | [ GROUP ] [ , ]... | [ ROLE ] [ , ]...

::= GROUP BY

::= 46 | The SQL Guide to Ingres

::= [ , ]...

::= HASH ON [ , ]...

::= PARTITION [ ] [ WITH LOCATION = ] | PARTITIONS [ WITH LOCATION = ]

::= HAVING

::= | A | B | C | D | E | F | a | b | c | d | e | f

::= BYTE [ ( ) ] | BINARY [ ( ) ] | BYTE VARYING [ ( ) ] | BYTE VAR [ ( ) ] | VARBINARY [ ( ) ] | LONG BYTE | BLOB | BINARY LARGE OBJECT

::= { X | x } ' ... ' | { 0x | 0X } ...

::= ":"

::= [ ]

::= [ , ]...

::= [ ] Appendix A Syntax of SQL | 47

::= LOCATION = ( [ , ]... ) | DUPLICATES | NODUPLICATES | PAGE_SIZE = | STRUCTURE = { BTREE | ISAM | HASH | RTREE } | KEY = | FILLFACTOR = | MINPAGES = | MAXPAGES = | LEAFFILL = | NONLEAFFILL = | COMPRESSION [ = ( [ KEY | NOKEY ] [ , DATA | NODATA ] ) ] | NOCOMPRESSION | ALLOCATION = | EXTEND = | UNIQUE_SCOPE = { STATEMENT | ROW } | RANGE = ( ( , ) , ( , ) ) | PRIORITY =

::= { DATE | TIME | TIMESTAMP } { '

::= ' ... '

::= TINYINT | INT1 | SMALLINT | INT2 | INTEGER | INT4 | INT | I | BIGINT | INT8

::= [ + | - ]

::= | - | | : : [ . ] 48 | The SQL Guide to Ingres

::= |

::= YEAR TO MONTH | DAY TO SECOND [ (

::= { YRS | MOS | DAYS | HRS | MINS | SECS }

::= YEAR TO MONTH | DAY TO SECOND | YEAR | MONTH | DAY | HOUR | MINUTE | SECOND

Two versions of the into clause exist. The first one is for use within embedded SQL, and the second one for use within stored procedures.

::= INTO [ , { ]...

::= INTO { | } [ , { | } ]...

::= ON | USING

::=

::= [ INNER ] JOIN | LEFT [ OUTER ] JOIN | RIGHT [ OUTER ] JOIN | FULL [ OUTER ] JOIN | CROSS JOIN Appendix A Syntax of SQL | 49

::= LOCATION = | PAGE_SIZE = { 2048 | 4096 | 8192 | 16384 | 32768 | 65536 } | STRUCTURE = { HASH | ISAM | BTREE } | FILLFACTOR = | MINPAGES = | MAXPAGES = | LEAFFILL = | NONLEAFFILL = | ALLOCATION = | EXTEND = | INDEX = { | BASE_TABLE_STRUCTURE } | NOINDEX

::= [ NOT ] IN | [ NOT ] IN

::= [ NOT ] LIKE [ ESCAPE ]

::= IS [ NOT ] NULL

::= PRIMARY KEY

::= | OR | AND | ( ) | NOT

::= | | | | |

::=

::= < | <= | > | >= 54 | The SQL Guide to Ingres

::= RANGE ON [ , ]...

::= PARTITION [ ] VALUES [ WITH LOCATION = ]

::= |

::= ON UPDATE { CASCADE | RESTRICT | SET NULL | NO ACTION } | ON DELETE { CASCADE | RESTRICT | SET NULL | NO ACTION }

::= REFERENCES

[ ] [ ... ]

::= PASSWORD = | EXTERNAL_PASSWORD | NOPASSWORD | NO PRIVILEGES | PRIVILEGES = ( ) | NOSECURITY_AUDIT | SECURITY_AUDIT

::=

For each alphanumeric, hexadecimal, numeric, and temporal data type a version of the scalar ex- pression exists.

::= |

::= ( [ , ]... )

::= Appendix A Syntax of SQL | 55

::= [ ]

::=

::= C2

[ [ ] [ ] [ ] ]

::= SELECT [ ] [ DISTINCT | ALL ] ::= [ [ AS ] ] |

.* | .* | *

[ ,

)

::= CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP | CURRENT_USER | INITIAL_USER | LOCAL_TIME | LOCAL_TIMESTAMP | SESSION_USER | SYSTEM_USER | USER

::= |

::= {
) | } [
::= [ CONSTRAINT ] { | | | } [ WITH [ , ]... ]

::= LOCATION = | JOURNALING | NOJOURNALING | DUPLICATES | NODUPLICATES | PAGE_SIZE = { 2048 | 4096 | 8192 | 16384 | 32768 | 65536 } | SECURITY_AUDIT = ( { TABLE | ROW | NOROW }... ) | SECURITY_AUDIT_KEY = ( ) | NOPARTITION | PARTITION = | STRUCTURE = { HASH | HEAP | ISAM | BTREE } | KEY = | FILLFACTOR = | MINPAGES = | MAXPAGES = | LEAFFILL = | NONLEAFFILL = | COMPRESSION [ = ( [ KEY | NOKEY ] [ , DATA | NODATA ] ) ] | continues Æ 58 | The SQL Guide to Ingres

NOCOMPRESSION | ALLOCATION = | EXTEND = whole number> | PRIORITY =

::= SELECT | INSERT | DELETE | UPDATE [ EXCLUDING ] [ ] | REFERENCES [ EXCLUDING ] [ ] | COPY_INTO | COPY_FROM

::= ALL [ PRIVILEGES ] |
[ ,
]...

In the table reference below, use of the index specification is allowed only in queries, not in updates, deletes, or inserts.

::=
[ [ AS ] ] | | ( ) |
[ AS ] | [ [ AS ] ]

::= (
[ ,
]... )

::= [ . ]

::= (
) Appendix A Syntax of SQL | 59

::= DATE | ANSIDATE | INGRESDATE | TIME [ (

::= |

::= { TIMESTAMP | timestamp } ' - - : : [ . < seconds fraction> ] [

::= USAGE = ( [ , ]... ) | NOUSAGE 60 | The SQL Guide to Ingres

::= DATABASE | WORK | JOURNAL | CHECKPOINT | DUMP | ALL

::= [ , ]...

::= PASSWORD = | NOPASSWORD | EXTERNAL_PASSWORD | PRIVILEGES = ( ) | NOPRIVILEGES | DEFAULT_PRIVILEGES = ( | DEFAULT_PRIVILEGES = ALL | NODEFAULT_PRIVILEGES | GROUP = | NOGROUP | EXPIRE_DATE = { |

::= VALUES ( [ , ]... )

::= |

::= WHEN THEN [ WHEN THEN ]...

::= WHEN THEN [ WHEN THEN ]...

::= WHERE

::= ... Appendix A Syntax of SQL | 61

::=

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

; ; ; ; ::=

::= [ | | _ | # | @ | $ ]...