2
0

sql-92.bnf 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. -- SQL-92 BNF Grammar Reference (Simplified)
  2. -- This is a reference for implementing the PizzaSQL parser.
  3. -- Statements
  4. <statement> ::=
  5. <select-statement>
  6. | <insert-statement>
  7. | <update-statement>
  8. | <delete-statement>
  9. | <create-table-statement>
  10. | <drop-table-statement>
  11. -- SELECT Statement
  12. <select-statement> ::=
  13. SELECT [ ALL | DISTINCT ] <select-list>
  14. [ <from-clause> ]
  15. [ <where-clause> ]
  16. [ <group-by-clause> ]
  17. [ <having-clause> ]
  18. [ <order-by-clause> ]
  19. [ <limit-clause> ]
  20. <select-list> ::=
  21. <asterisk>
  22. | <select-item> [ { <comma> <select-item> }... ]
  23. <select-item> ::=
  24. <expression> [ [ AS ] <column-alias> ]
  25. | <table-name> <period> <asterisk>
  26. <from-clause> ::=
  27. FROM <table-reference> [ { <comma> <table-reference> }... ]
  28. <table-reference> ::=
  29. <table-name> [ [ AS ] <table-alias> ]
  30. | <table-reference> <join-type> <table-reference> <join-condition>
  31. <join-type> ::=
  32. [ INNER ] JOIN
  33. | LEFT [ OUTER ] JOIN
  34. | RIGHT [ OUTER ] JOIN
  35. | FULL [ OUTER ] JOIN
  36. | CROSS JOIN
  37. | NATURAL JOIN
  38. <join-condition> ::=
  39. ON <search-condition>
  40. | USING <left-paren> <column-name-list> <right-paren>
  41. <where-clause> ::=
  42. WHERE <search-condition>
  43. <group-by-clause> ::=
  44. GROUP BY <expression-list>
  45. <having-clause> ::=
  46. HAVING <search-condition>
  47. <order-by-clause> ::=
  48. ORDER BY <order-item> [ { <comma> <order-item> }... ]
  49. <order-item> ::=
  50. <expression> [ ASC | DESC ]
  51. <limit-clause> ::=
  52. LIMIT <expression> [ OFFSET <expression> ]
  53. -- INSERT Statement
  54. <insert-statement> ::=
  55. INSERT INTO <table-name>
  56. [ <left-paren> <column-name-list> <right-paren> ]
  57. <insert-source>
  58. <insert-source> ::=
  59. VALUES <values-list>
  60. | <select-statement>
  61. <values-list> ::=
  62. <left-paren> <expression-list> <right-paren>
  63. [ { <comma> <left-paren> <expression-list> <right-paren> }... ]
  64. -- UPDATE Statement
  65. <update-statement> ::=
  66. UPDATE <table-name>
  67. SET <assignment-list>
  68. [ <where-clause> ]
  69. <assignment-list> ::=
  70. <assignment> [ { <comma> <assignment> }... ]
  71. <assignment> ::=
  72. <column-name> <equals> <expression>
  73. -- DELETE Statement
  74. <delete-statement> ::=
  75. DELETE FROM <table-name>
  76. [ <where-clause> ]
  77. -- CREATE TABLE Statement
  78. <create-table-statement> ::=
  79. CREATE TABLE [ IF NOT EXISTS ] <table-name>
  80. <left-paren>
  81. <table-element> [ { <comma> <table-element> }... ]
  82. <right-paren>
  83. <table-element> ::=
  84. <column-definition>
  85. | <table-constraint>
  86. <column-definition> ::=
  87. <column-name> <data-type> [ <column-constraint>... ]
  88. <data-type> ::=
  89. INTEGER | INT | SMALLINT | BIGINT
  90. | REAL | FLOAT | DOUBLE
  91. | NUMERIC [ <left-paren> <precision> [ <comma> <scale> ] <right-paren> ]
  92. | DECIMAL [ <left-paren> <precision> [ <comma> <scale> ] <right-paren> ]
  93. | TEXT
  94. | VARCHAR [ <left-paren> <length> <right-paren> ]
  95. | CHAR [ <left-paren> <length> <right-paren> ]
  96. | CHARACTER [ <left-paren> <length> <right-paren> ]
  97. | BLOB
  98. | BOOLEAN
  99. | DATE | TIME | TIMESTAMP | DATETIME
  100. <column-constraint> ::=
  101. PRIMARY KEY
  102. | NOT NULL
  103. | UNIQUE
  104. | DEFAULT <expression>
  105. | REFERENCES <table-name> [ <left-paren> <column-name> <right-paren> ]
  106. | AUTOINCREMENT
  107. <table-constraint> ::=
  108. [ CONSTRAINT <constraint-name> ]
  109. ( PRIMARY KEY <left-paren> <column-name-list> <right-paren>
  110. | UNIQUE <left-paren> <column-name-list> <right-paren>
  111. | FOREIGN KEY <left-paren> <column-name-list> <right-paren>
  112. REFERENCES <table-name> <left-paren> <column-name-list> <right-paren>
  113. | CHECK <left-paren> <search-condition> <right-paren>
  114. )
  115. -- DROP TABLE Statement
  116. <drop-table-statement> ::=
  117. DROP TABLE [ IF EXISTS ] <table-name> [ { <comma> <table-name> }... ]
  118. -- Expressions
  119. <expression> ::=
  120. <or-expression>
  121. <or-expression> ::=
  122. <and-expression>
  123. | <or-expression> OR <and-expression>
  124. <and-expression> ::=
  125. <not-expression>
  126. | <and-expression> AND <not-expression>
  127. <not-expression> ::=
  128. NOT <not-expression>
  129. | <comparison-expression>
  130. <comparison-expression> ::=
  131. <additive-expression>
  132. | <additive-expression> <comparison-operator> <additive-expression>
  133. | <additive-expression> IS [ NOT ] NULL
  134. | <additive-expression> [ NOT ] IN <in-value>
  135. | <additive-expression> [ NOT ] BETWEEN <additive-expression> AND <additive-expression>
  136. | <additive-expression> [ NOT ] LIKE <additive-expression> [ ESCAPE <additive-expression> ]
  137. <comparison-operator> ::=
  138. <equals> | <not-equals> | <less-than> | <greater-than>
  139. | <less-than-or-equals> | <greater-than-or-equals>
  140. <in-value> ::=
  141. <left-paren> <expression-list> <right-paren>
  142. | <left-paren> <select-statement> <right-paren>
  143. <additive-expression> ::=
  144. <multiplicative-expression>
  145. | <additive-expression> <plus> <multiplicative-expression>
  146. | <additive-expression> <minus> <multiplicative-expression>
  147. | <additive-expression> <concat> <multiplicative-expression>
  148. <multiplicative-expression> ::=
  149. <unary-expression>
  150. | <multiplicative-expression> <asterisk> <unary-expression>
  151. | <multiplicative-expression> <slash> <unary-expression>
  152. | <multiplicative-expression> <percent> <unary-expression>
  153. <unary-expression> ::=
  154. <primary-expression>
  155. | <minus> <unary-expression>
  156. | <plus> <unary-expression>
  157. <primary-expression> ::=
  158. <literal>
  159. | <column-reference>
  160. | <function-call>
  161. | <case-expression>
  162. | <cast-expression>
  163. | <exists-expression>
  164. | <left-paren> <expression> <right-paren>
  165. | <left-paren> <select-statement> <right-paren>
  166. <literal> ::=
  167. <number>
  168. | <string>
  169. | NULL
  170. | TRUE
  171. | FALSE
  172. <column-reference> ::=
  173. [ <table-name> <period> ] <column-name>
  174. <function-call> ::=
  175. <function-name> <left-paren>
  176. [ [ DISTINCT ] <expression-list> | <asterisk> ]
  177. <right-paren>
  178. <case-expression> ::=
  179. CASE [ <expression> ]
  180. <when-clause>...
  181. [ ELSE <expression> ]
  182. END
  183. <when-clause> ::=
  184. WHEN <expression> THEN <expression>
  185. <cast-expression> ::=
  186. CAST <left-paren> <expression> AS <data-type> <right-paren>
  187. <exists-expression> ::=
  188. EXISTS <left-paren> <select-statement> <right-paren>
  189. -- Lists
  190. <expression-list> ::=
  191. <expression> [ { <comma> <expression> }... ]
  192. <column-name-list> ::=
  193. <column-name> [ { <comma> <column-name> }... ]
  194. -- Tokens
  195. <table-name> ::= <identifier>
  196. <column-name> ::= <identifier>
  197. <table-alias> ::= <identifier>
  198. <column-alias> ::= <identifier>
  199. <function-name> ::= <identifier>
  200. <constraint-name> ::= <identifier>
  201. <identifier> ::=
  202. <regular-identifier>
  203. | <delimited-identifier>
  204. <regular-identifier> ::= <letter> [ { <letter> | <digit> | <underscore> }... ]
  205. <delimited-identifier> ::=
  206. <double-quote> <character>... <double-quote>
  207. | <backtick> <character>... <backtick>
  208. | <left-bracket> <character>... <right-bracket>
  209. <number> ::= <integer> | <float>
  210. <string> ::= <single-quote> <character>... <single-quote>
  211. -- Symbols
  212. <left-paren> ::= (
  213. <right-paren> ::= )
  214. <comma> ::= ,
  215. <period> ::= .
  216. <semicolon> ::= ;
  217. <asterisk> ::= *
  218. <plus> ::= +
  219. <minus> ::= -
  220. <slash> ::= /
  221. <percent> ::= %
  222. <concat> ::= ||
  223. <equals> ::= =
  224. <not-equals> ::= <> | !=
  225. <less-than> ::= <
  226. <greater-than> ::= >
  227. <less-than-or-equals> ::= <=
  228. <greater-than-or-equals> ::= >=