File: sqlsyntax.tex

package info (click to toggle)
curry-tools 1.0.1%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 5,492 kB
  • ctags: 121
  • sloc: makefile: 470; sh: 421
file content (219 lines) | stat: -rw-r--r-- 7,586 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
\section{SQL Syntax Supported by CurryPP}
\label{app:sqlsyntax}

This section contains a grammar in EBNF which specifies
the SQL syntax recognized by the Curry preprocessor
in integrated SQL code (see Sect.~\ref{sec:integratedsql}).
%
The grammar satisfies the LL(1) property and is influenced by the
SQLite  dialect.\footnote{\url{https://sqlite.org/lang.html}}

\begin{lstlisting} 
--------------type of statements--------------------------------

 statement ::= queryStatement | transactionStatement  
 queryStatement ::= ( deleteStatement 
                     | insertStatement 
                     | selectStatement 
                     | updateStatement )
                     ';'

 ------------- transaction -------------------------------------
 
 transactionStatement ::= (BEGIN                                        
                           |IN TRANSACTION '(' queryStatement 
                                            { queryStatement }')'  
                           |COMMIT                                       
                           |ROLLBACK ) ';'

-------------- delete ------------------------------------------

 deleteStatement ::= DELETE FROM tableSpecification 
                                 [ WHERE condition ]

 -------------insert -------------------------------------------
 
 insertStatement ::= INSERT INTO tableSpecification 
                                 insertSpecification

 insertSpecification ::= ['(' columnNameList ')' ] valuesClause

 valuesClause ::= VALUES valueList

  ------------update--------------------------------------------
  
 updateStatement ::= UPDATE tableSpecification 
                     SET (columnAssignment {',' columnAssignment} 
                                              [ WHERE condition ] 
                         | embeddedCurryExpression )
 
 columnAssignment ::= columnName '=' literal
 
 
 -------------select statement ---------------------------------

 selectStatement ::= selectHead { setOperator selectHead } 
                                [ orderByClause ] 
                                [ limitClause ]
 selectHead ::= selectClause fromClause  
                             [ WHERE condition ] 
                             [ groupByClause [ havingClause ]]
                                
 setOperator ::= UNION | INTERSECT | EXCEPT    

 selectClause ::= SELECT [( DISTINCT | ALL )] 
                         ( selectElementList | '*' )

 selectElementList ::=  selectElement { ',' selectElement }

 selectElement ::= [ tableIdentifier'.' ] columnName 
                  | aggregation 
                  | caseExpression

 aggregation ::= function '(' [ DISTINCT ] columnReference ')' 

 caseExpression ::= CASE WHEN condition THEN operand 
                                        ELSE operand END 

 function ::= COUNT | MIN | MAX | AVG | SUM

 fromClause ::= FROM tableReference  { ',' tableReference } 

 groupByClause ::= GROUP BY columnList

 havingClause ::= HAVING conditionWithAggregation 

 orderByClause ::= ORDER BY columnReference [ sortDirection ] 
                            {',' columnReference 
                                 [ sortDirection ] }

 sortDirection ::= ASC | DESC

 limitClause = LIMIT integerExpression

 -------------common elements-----------------------------------

 columnList ::=  columnReference  { ',' columnReference } 
 
 columnReference ::= [ tableIdentifier'.' ] columnName
 
 columnNameList ::= columnName  { ',' columnName} 
 
 tableReference ::=  tableSpecification [ AS tablePseudonym ] 
                                        [ joinSpecification ]
 tableSpecification ::= tableName
   
 condition ::=   operand operatorExpression 
                         [logicalOperator condition]  
               | EXISTS subquery [logicalOperator condition]             
               | NOT condition                                           
               | '(' condition  ')'                                      
               | satConstraint [logicalOperator condition]
              
 operand ::=  columnReference 
             | literal           
             
             
 subquery ::= '(' selectStatement ')'            

 operatorExpression ::=  IS NULL                      
                       | NOT NULL                      
                       | binaryOperator operand        
                       | IN setSpecification           
                       | BETWEEN operand operand       
                       | LIKE quotes pattern quotes
  
 setSpecification ::=  literalList

 binaryOperator ::= '>'| '<' | '>=' | '<=' | '=' | '!='

 logicalOperator ::= AND | OR 

 conditionWithAggregation ::= 
         aggregation [logicalOperator disaggregation]                
       | '(' conditionWithAggregation  ')'                                     
       | operand operatorExpression 
                [logicalOperator conditionWithAggregation] 
       | NOT conditionWithAggregation                                          
       | EXISTS subquery 
                [logicalOperator conditionWithAggregation]                                                                   
       | satConstraint
                [logicalOperator conditionWithAggregation]

 aggregation ::= function '('(ALL | DISTINCT) columnReference')' 
                           binaryOperator 
                           operand

 satConstraint ::= SATISFIES tablePseudonym 
                             relation 
                             tablePseudonym

 joinSpecification ::=  joinType tableSpecification
                                [ AS tablePseudonym ] 
                                [ joinCondition ] 
                                [ joinSpecification ]

 joinType ::= CROSS JOIN | INNER JOIN

 joinCondition ::= ON condition                                        

 -------------identifier and datatypes-------------------------

 valueList ::= ( embeddedCurryExpression | literalList ) 
                {',' ( embeddedCurryExpression | literalList )} 
                
 literalList ::= '(' literal  { ',' literal }  ')'

 literal ::=   numericalLiteral                              
             | quotes alphaNumericalLiteral quotes
             | dateLiteral                                   
             | booleanLiteral  
             | embeddedCurryExpression                              
             | NULL

 numericalLiteral ::=  integerExpression 
                      |floatExpression   

 integerExpression ::= [ - ] digit { digit }

 floatExpression := [ - ] digit { digit } '.' digit { digit } 

 alphaNumericalLiteral ::=  character { character }  
 character ::= digit | letter 

 dateLiteral ::=  year ':' month ':' day ':' 
                  hours ':' minutes ':' seconds

 month ::= digit digit
 day ::= digit digit
 hours ::= digit digit
 minutes ::= digit digit
 seconds ::= digit digit
 year ::= digit digit digit digit
 
 booleanLiteral ::= TRUE | FALSE

 embeddedCurryExpression ::= '{' curryExpression '}'

 pattern ::= ( character | specialCharacter )
              {( character | specialCharacter )}             
 specialCharacter ::= '%' | '_'

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

 letter ::= (a...z) | (A...Z)

 tableIdentifier ::= tablePseudonym | tableName
 columnName ::= letter [alphanumericalLiteral]
 tableName ::= letter [alphanumericalLiteral]
 tablePseudonym ::= letter
 relation ::= letter [[alphanumericalLiteral] | '_' ]
 quotes ::= ('"'|''')
  
\end{lstlisting}


%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "../../../docs/src/manual"
%%% End: