xref: /trunk/main/connectivity/source/parse/sqlbison.y (revision 61dff127b6698e0bae836c8aedd6ec62111483d1)
1 %{
2 //--------------------------------------------------------------------------
3 //
4 // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 //
6 // Copyright 2000, 2010 Oracle and/or its affiliates.
7 //
8 // OpenOffice.org - a multi-platform office productivity suite
9 //
10 // This file is part of OpenOffice.org.
11 //
12 // OpenOffice.org is free software: you can redistribute it and/or modify
13 // it under the terms of the GNU Lesser General Public License version 3
14 // only, as published by the Free Software Foundation.
15 //
16 // OpenOffice.org is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 // GNU Lesser General Public License version 3 for more details
20 // (a copy is included in the LICENSE file that accompanied this code).
21 //
22 // You should have received a copy of the GNU Lesser General Public License
23 // version 3 along with OpenOffice.org.  If not, see
24 // <http://www.openoffice.org/license.html>
25 // for a copy of the LGPLv3 License.
26 //
27 //--------------------------------------------------------------------------
28 
29 #include <vector>
30 #include <string.h>
31 
32 #ifndef _CONNECTIVITY_SQLNODE_HXX
33 #include <connectivity/sqlnode.hxx>
34 #endif
35 #ifndef _CONNECTIVITY_SQLPARSE_HXX
36 #include <connectivity/sqlparse.hxx>
37 #endif
38 #ifndef _CONNECTIVITY_SQLINTERNALNODE_HXX
39 #include <internalnode.hxx>
40 #endif
41 #ifndef _COM_SUN_STAR_LANG_LOCALE_HPP_
42 #include <com/sun/star/lang/Locale.hpp>
43 #endif
44 #ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
45 #include <com/sun/star/sdbc/DataType.hpp>
46 #endif
47 #ifndef _COM_SUN_STAR_UTIL_DATE_HPP_
48 #include <com/sun/star/util/Date.hpp>
49 #endif
50 #ifndef _COM_SUN_STAR_UTIL_DATETIME_HPP_
51 #include <com/sun/star/util/DateTime.hpp>
52 #endif
53 #ifndef _COM_SUN_STAR_UTIL_TIME_HPP_
54 #include <com/sun/star/util/Time.hpp>
55 #endif
56 #ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTER_HPP_
57 #include <com/sun/star/util/XNumberFormatter.hpp>
58 #endif
59 #ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATSSUPPLIER_HPP_
60 #include <com/sun/star/util/XNumberFormatsSupplier.hpp>
61 #endif
62 #ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATS_HPP_
63 #include <com/sun/star/util/XNumberFormats.hpp>
64 #endif
65 #ifndef _COM_SUN_STAR_UTIL_NUMBERFORMAT_HPP_
66 #include <com/sun/star/util/NumberFormat.hpp>
67 #endif
68 #ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTYPES_HPP_
69 #include <com/sun/star/util/XNumberFormatTypes.hpp>
70 #endif
71 #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
72 #include <com/sun/star/beans/XPropertySet.hpp>
73 #endif
74 #ifndef _COM_SUN_STAR_I18N_KPARSETYPE_HPP_
75 #include <com/sun/star/i18n/KParseType.hpp>
76 #endif
77 #ifndef _COM_SUN_STAR_I18N_KPARSETOKENS_HPP_
78 #include <com/sun/star/i18n/KParseTokens.hpp>
79 #endif
80 #ifndef _CONNECTIVITY_SQLSCAN_HXX
81 #include "sqlscan.hxx"
82 #endif
83 #ifndef _OSL_DIAGNOSE_H_
84 #include <osl/diagnose.h>
85 #endif
86 #ifndef _DBHELPER_DBCONVERSION_HXX_
87 #include "connectivity/dbconversion.hxx"
88 #endif
89 #include <rtl/ustrbuf.hxx>
90 
91 #if defined __GNUC__
92     #pragma GCC system_header
93 #elif defined __SUNPRO_CC
94 #pragma disable_warn
95 #elif defined _MSC_VER
96 #pragma warning(push, 1)
97 #pragma warning(disable:4273 4701 4706)
98 #endif
99 
100 static ::rtl::OUString aEmptyString;
101 
102 static connectivity::OSQLInternalNode* newNode(const sal_Char* pNewValue,
103                                  const connectivity::SQLNodeType eNodeType,
104                                  const sal_uInt32 nNodeID = 0)
105 {
106     return new connectivity::OSQLInternalNode(pNewValue, eNodeType, nNodeID);
107 }
108 
109 static connectivity::OSQLInternalNode* newNode(const ::rtl::OString& _NewValue,
110                                 const connectivity::SQLNodeType eNodeType,
111                                 const sal_uInt32 nNodeID = 0)
112 {
113     return new connectivity::OSQLInternalNode(_NewValue, eNodeType, nNodeID);
114 }
115 
116 static connectivity::OSQLInternalNode* newNode(const ::rtl::OUString& _NewValue,
117                                 const connectivity::SQLNodeType eNodeType,
118                                 const sal_uInt32 nNodeID = 0)
119 {
120     return new connectivity::OSQLInternalNode(_NewValue, eNodeType, nNodeID);
121 }
122 
123 
124 // yyi ist die interne Nr. der Regel, die gerade reduziert wird.
125 // Ueber die Mapping-Tabelle yyrmap wird daraus eine externe Regel-Nr.
126 #define SQL_NEW_RULE            newNode(aEmptyString, SQL_NODE_RULE, yyr1[yyn])
127 #define SQL_NEW_LISTRULE        newNode(aEmptyString, SQL_NODE_LISTRULE, yyr1[yyn])
128 #define SQL_NEW_COMMALISTRULE   newNode(aEmptyString, SQL_NODE_COMMALISTRULE, yyr1[yyn])
129 
130 
131 connectivity::OSQLParser* xxx_pGLOBAL_SQLPARSER;
132 
133 #define YYERROR_VERBOSE
134 
135 #define SQLyyerror(s)                       \
136 {                                           \
137     xxx_pGLOBAL_SQLPARSER->error(s);        \
138 }
139 
140 using namespace connectivity;
141 #define SQLyylex xxx_pGLOBAL_SQLPARSER->SQLlex
142 %}
143     /* symbolic tokens */
144 
145 %union {
146     connectivity::OSQLParseNode * pParseNode;
147 }
148 %type <pParseNode> '(' ')' ',' ':' ';' '?' '[' ']' '{' '}' '.' 'K' 'M' 'G' 'T' 'P'
149 
150 %token <pParseNode> SQL_TOKEN_STRING SQL_TOKEN_ACCESS_DATE SQL_TOKEN_INT SQL_TOKEN_REAL_NUM
151 %token <pParseNode> SQL_TOKEN_INTNUM SQL_TOKEN_APPROXNUM SQL_TOKEN_NOT SQL_TOKEN_NAME
152 
153 
154 %nonassoc <pParseNode> SQL_TOKEN_UMINUS
155 
156 
157 
158     /* literal keyword tokens */
159 
160 %token <pParseNode> SQL_TOKEN_ALL SQL_TOKEN_ALTER SQL_TOKEN_AMMSC SQL_TOKEN_ANY SQL_TOKEN_AS SQL_TOKEN_ASC SQL_TOKEN_AT SQL_TOKEN_AUTHORIZATION SQL_TOKEN_AVG
161 
162 %token <pParseNode> SQL_TOKEN_BETWEEN SQL_TOKEN_BIT SQL_TOKEN_BOTH SQL_TOKEN_BY
163 
164 %token <pParseNode> SQL_TOKEN_CAST SQL_TOKEN_CHARACTER SQL_TOKEN_CHECK SQL_TOKEN_COLLATE SQL_TOKEN_COMMIT SQL_TOKEN_CONTINUE SQL_TOKEN_CONVERT SQL_TOKEN_COUNT SQL_TOKEN_CREATE SQL_TOKEN_CROSS
165 %token <pParseNode> SQL_TOKEN_CURRENT SQL_TOKEN_CURSOR
166 
167 %token <pParseNode> SQL_TOKEN_DATE SQL_TOKEN_DATEVALUE SQL_TOKEN_DAY SQL_TOKEN_DEC SQL_TOKEN_DECIMAL SQL_TOKEN_DECLARE SQL_TOKEN_DEFAULT SQL_TOKEN_DELETE SQL_TOKEN_DESC
168 %token <pParseNode> SQL_TOKEN_DISTINCT SQL_TOKEN_DOUBLE SQL_TOKEN_DROP
169 
170 %token <pParseNode> SQL_TOKEN_ESCAPE SQL_TOKEN_EXCEPT SQL_TOKEN_EXISTS SQL_TOKEN_FALSE SQL_TOKEN_FETCH SQL_TOKEN_FLOAT SQL_TOKEN_FOR SQL_TOKEN_FOREIGN SQL_TOKEN_FOUND SQL_TOKEN_FROM SQL_TOKEN_FULL
171 
172 %token <pParseNode> SQL_TOKEN_GRANT SQL_TOKEN_GROUP SQL_TOKEN_HAVING SQL_TOKEN_IN SQL_TOKEN_INDICATOR SQL_TOKEN_INNER SQL_TOKEN_INTEGER SQL_TOKEN_INTO SQL_TOKEN_IS SQL_TOKEN_INTERSECT
173 
174 %token <pParseNode> SQL_TOKEN_JOIN SQL_TOKEN_KEY SQL_TOKEN_LEADING SQL_TOKEN_LIKE SQL_TOKEN_LOCAL SQL_TOKEN_LOWER
175 %token <pParseNode> SQL_TOKEN_MAX SQL_TOKEN_MIN SQL_TOKEN_NATURAL SQL_TOKEN_NCHAR SQL_TOKEN_NULL SQL_TOKEN_NUMERIC
176 
177 %token <pParseNode> SQL_TOKEN_OCTET_LENGTH SQL_TOKEN_OF SQL_TOKEN_ON SQL_TOKEN_OPTION SQL_TOKEN_ORDER SQL_TOKEN_OUTER
178 
179 %token <pParseNode> SQL_TOKEN_PRECISION SQL_TOKEN_PRIMARY SQL_TOKEN_PRIVILEGES SQL_TOKEN_PROCEDURE SQL_TOKEN_PUBLIC
180 %token <pParseNode> SQL_TOKEN_REAL SQL_TOKEN_REFERENCES SQL_TOKEN_ROLLBACK
181 
182 %token <pParseNode> SQL_TOKEN_SCHEMA SQL_TOKEN_SELECT SQL_TOKEN_SET SQL_TOKEN_SIZE SQL_TOKEN_SMALLINT SQL_TOKEN_SOME SQL_TOKEN_SQLCODE SQL_TOKEN_SQLERROR SQL_TOKEN_SUM
183 
184 %token <pParseNode> SQL_TOKEN_TABLE SQL_TOKEN_TIME SQL_TOKEN_TIMESTAMP SQL_TOKEN_TIMEZONE_HOUR SQL_TOKEN_TIMEZONE_MINUTE SQL_TOKEN_TO SQL_TOKEN_TRAILING SQL_TOKEN_TRANSLATE SQL_TOKEN_TRIM SQL_TOKEN_TRUE SQL_TOKEN_UNION
185 %token <pParseNode> SQL_TOKEN_UNIQUE SQL_TOKEN_UNKNOWN SQL_TOKEN_UPDATE SQL_TOKEN_UPPER SQL_TOKEN_USAGE SQL_TOKEN_USER SQL_TOKEN_USING SQL_TOKEN_VALUES SQL_TOKEN_VIEW
186 %token <pParseNode> SQL_TOKEN_WHERE SQL_TOKEN_WITH SQL_TOKEN_WORK SQL_TOKEN_ZONE
187 
188 /* ODBC KEYWORDS */
189 %token <pParseNode> SQL_TOKEN_CALL SQL_TOKEN_D SQL_TOKEN_FN SQL_TOKEN_T SQL_TOKEN_TS SQL_TOKEN_OJ
190 /* string functions */
191 %token <pParseNode> SQL_TOKEN_ASCII SQL_TOKEN_BIT_LENGTH  SQL_TOKEN_CHAR  SQL_TOKEN_CHAR_LENGTH  SQL_TOKEN_SQL_TOKEN_INTNUM
192 %token <pParseNode> SQL_TOKEN_CONCAT
193 %token <pParseNode> SQL_TOKEN_DIFFERENCE  SQL_TOKEN_INSERT SQL_TOKEN_LCASE  SQL_TOKEN_LEFT SQL_TOKEN_LENGTH  SQL_TOKEN_LOCATE
194 %token <pParseNode> SQL_TOKEN_LOCATE_2 SQL_TOKEN_LTRIM SQL_TOKEN_POSITION SQL_TOKEN_REPEAT SQL_TOKEN_REPLACE
195 %token <pParseNode> SQL_TOKEN_RIGHT SQL_TOKEN_RTRIM SQL_TOKEN_SOUNDEX SQL_TOKEN_SPACE  SQL_TOKEN_SUBSTRING SQL_TOKEN_UCASE
196 
197 /* time and date functions */
198 %token <pParseNode> SQL_TOKEN_CURRENT_DATE SQL_TOKEN_CURRENT_TIME SQL_TOKEN_CURRENT_TIMESTAMP SQL_TOKEN_CURDATE SQL_TOKEN_CURTIME
199 %token <pParseNode> SQL_TOKEN_DAYNAME  SQL_TOKEN_DAYOFMONTH  SQL_TOKEN_DAYOFWEEK  SQL_TOKEN_DAYOFYEAR SQL_TOKEN_EXTRACT
200 %token <pParseNode> SQL_TOKEN_HOUR SQL_TOKEN_MINUTE  SQL_TOKEN_MONTH  SQL_TOKEN_MONTHNAME SQL_TOKEN_NOW SQL_TOKEN_QUARTER SQL_TOKEN_DATEDIFF
201 %token <pParseNode> SQL_TOKEN_SECOND SQL_TOKEN_TIMESTAMPADD SQL_TOKEN_TIMESTAMPDIFF SQL_TOKEN_TIMEVALUE SQL_TOKEN_WEEK SQL_TOKEN_YEAR
202 
203 /* numeric functions */
204 %token <pParseNode> SQL_TOKEN_ABS SQL_TOKEN_ACOS SQL_TOKEN_ASIN SQL_TOKEN_ATAN SQL_TOKEN_ATAN2 SQL_TOKEN_CEILING
205 %token <pParseNode> SQL_TOKEN_COS SQL_TOKEN_COT SQL_TOKEN_DEGREES SQL_TOKEN_EXP SQL_TOKEN_FLOOR SQL_TOKEN_LOGF  SQL_TOKEN_LOG SQL_TOKEN_LN
206 %token <pParseNode> SQL_TOKEN_LOG10 SQL_TOKEN_MOD SQL_TOKEN_PI SQL_TOKEN_POWER SQL_TOKEN_RADIANS SQL_TOKEN_RAND SQL_TOKEN_ROUNDMAGIC
207 %token <pParseNode> SQL_TOKEN_ROUND   SQL_TOKEN_SIGN    SQL_TOKEN_SIN     SQL_TOKEN_SQRT    SQL_TOKEN_TAN SQL_TOKEN_TRUNCATE
208 
209 // computational operation
210 %token <pParseNode> SQL_TOKEN_EVERY SQL_TOKEN_INTERSECTION SQL_TOKEN_FUSION SQL_TOKEN_COLLECT SQL_TOKEN_VAR_POP SQL_TOKEN_VAR_SAMP
211 %token <pParseNode> SQL_TOKEN_STDDEV_SAMP SQL_TOKEN_STDDEV_POP
212 
213 %token <pParseNode> SQL_TOKEN_RANK SQL_TOKEN_DENSE_RANK SQL_TOKEN_PERCENT_RANK  SQL_TOKEN_CUME_DIST SQL_TOKEN_PERCENTILE_CONT SQL_TOKEN_PERCENTILE_DISC SQL_TOKEN_WITHIN SQL_TOKEN_ARRAY_AGG
214 %token <pParseNode> SQL_TOKEN_CASE SQL_TOKEN_THEN SQL_TOKEN_END SQL_TOKEN_NULLIF SQL_TOKEN_COALESCE SQL_TOKEN_WHEN SQL_TOKEN_ELSE
215 %token <pParseNode> SQL_TOKEN_BEFORE SQL_TOKEN_AFTER SQL_TOKEN_INSTEAD SQL_TOKEN_EACH SQL_TOKEN_REFERENCING SQL_TOKEN_BEGIN SQL_TOKEN_ATOMIC SQL_TOKEN_TRIGGER SQL_TOKEN_ROW SQL_TOKEN_STATEMENT
216 %token <pParseNode> SQL_TOKEN_NEW SQL_TOKEN_OLD
217 %token <pParseNode> SQL_TOKEN_VALUE SQL_TOKEN_CURRENT_CATALOG SQL_TOKEN_CURRENT_DEFAULT_TRANSFORM_GROUP SQL_TOKEN_CURRENT_PATH SQL_TOKEN_CURRENT_ROLE SQL_TOKEN_CURRENT_SCHEMA SQL_TOKEN_CURRENT_USER
218 %token <pParseNode> SQL_TOKEN_SESSION_USER SQL_TOKEN_SYSTEM_USER SQL_TOKEN_VARCHAR SQL_TOKEN_VARBINARY SQL_TOKEN_VARYING SQL_TOKEN_OBJECT SQL_TOKEN_NCLOB SQL_TOKEN_NATIONAL
219 %token <pParseNode> SQL_TOKEN_LARGE SQL_TOKEN_CLOB SQL_TOKEN_BLOB SQL_TOKEN_BIGINT SQL_TOKEN_BINARY SQL_TOKEN_WITHOUT SQL_TOKEN_BOOLEAN SQL_TOKEN_INTERVAL
220 // window function
221 %token <pParseNode> SQL_TOKEN_OVER SQL_TOKEN_ROW_NUMBER SQL_TOKEN_NTILE SQL_TOKEN_LEAD SQL_TOKEN_LAG SQL_TOKEN_RESPECT SQL_TOKEN_IGNORE SQL_TOKEN_NULLS
222 %token <pParseNode> SQL_TOKEN_FIRST_VALUE SQL_TOKEN_LAST_VALUE SQL_TOKEN_NTH_VALUE SQL_TOKEN_FIRST SQL_TOKEN_LAST
223 %token <pParseNode> SQL_TOKEN_EXCLUDE SQL_TOKEN_OTHERS SQL_TOKEN_TIES SQL_TOKEN_FOLLOWING SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING SQL_TOKEN_RANGE SQL_TOKEN_ROWS
224 %token <pParseNode> SQL_TOKEN_PARTITION SQL_TOKEN_WINDOW SQL_TOKEN_NO
225 // LIMIT and OFFSEt
226 %token <pParseNode> SQL_TOKEN_LIMIT SQL_TOKEN_OFFSET SQL_TOKEN_NEXT SQL_TOKEN_ONLY
227 
228     /* operators */
229 %left SQL_TOKEN_NAME
230 %left <pParseNode> SQL_TOKEN_OR
231 %left <pParseNode> SQL_TOKEN_AND
232 
233 %left <pParseNode> SQL_LESSEQ SQL_GREATEQ SQL_NOTEQUAL SQL_LESS SQL_GREAT SQL_EQUAL /* '<' '>' = <> < > <= >= != */
234 %left <pParseNode> '+' '-' SQL_CONCAT
235 %left <pParseNode> '*' '/'
236 %left SQL_TOKEN_NATURAL SQL_TOKEN_CROSS SQL_TOKEN_FULL SQL_TOKEN_LEFT SQL_TOKEN_RIGHT
237 %left ')'
238 %right '='
239 %right '.'
240 %right '('
241 
242 
243 %token <pParseNode> SQL_TOKEN_INVALIDSYMBOL
244 
245 /*%type <pParseNode> sql_single_statement */
246 
247 %type <pParseNode> sql /*schema */
248 %type <pParseNode> column_def_opt_list column_def_opt table_constraint_def column_commalist
249 %type <pParseNode> view_def opt_with_check_option opt_column_commalist privilege_def
250 %type <pParseNode> opt_with_grant_option privileges operation_commalist operation
251 %type <pParseNode> grantee_commalist grantee opt_order_by_clause ordering_spec_commalist
252 %type <pParseNode> ordering_spec opt_asc_desc manipulative_statement commit_statement
253 %type <pParseNode> /*delete_statement_positioned*/ delete_statement_searched fetch_statement
254 %type <pParseNode> insert_statement values_or_query_spec
255 %type <pParseNode> rollback_statement select_statement_into opt_all_distinct
256 %type <pParseNode> /*update_statement_positioned*/ assignment_commalist assignment
257 %type <pParseNode> update_statement_searched target_commalist target opt_where_clause
258 %type <pParseNode> select_statement selection table_exp from_clause table_ref_commalist table_ref
259 %type <pParseNode> where_clause opt_group_by_clause column_ref_commalist opt_having_clause
260 %type <pParseNode> search_condition predicate comparison_predicate comparison_predicate_part_2 between_predicate between_predicate_part_2
261 %type <pParseNode> like_predicate opt_escape test_for_null null_predicate_part_2 in_predicate in_predicate_part_2 character_like_predicate_part_2 other_like_predicate_part_2
262 %type <pParseNode> all_or_any_predicate any_all_some existence_test subquery quantified_comparison_predicate_part_2
263 %type <pParseNode> scalar_exp_commalist parameter_ref literal parenthesized_boolean_value_expression
264 %type <pParseNode> column_ref data_type column cursor parameter range_variable user /*like_check*/
265 /* neue Regeln bei OJ */
266 %type <pParseNode> derived_column as_clause table_name num_primary term num_value_exp
267 %type <pParseNode> value_exp_primary num_value_fct unsigned_value_spec cast_spec set_fct_spec  scalar_subquery
268 %type <pParseNode> position_exp extract_exp length_exp general_value_spec
269 %type <pParseNode> general_set_fct set_fct_type query_exp non_join_query_exp joined_table
270 %type <pParseNode> non_join_query_term non_join_query_primary simple_table
271 %type <pParseNode> table_value_const_list row_value_constructor row_value_const_list row_value_constructor_elem
272 %type <pParseNode> qualified_join value_exp query_term join_type outer_join_type join_condition boolean_term
273 %type <pParseNode> boolean_factor truth_value boolean_test boolean_primary named_columns_join join_spec
274 %type <pParseNode> cast_operand cast_target factor datetime_value_exp /*interval_value_exp*/ datetime_term datetime_factor
275 %type <pParseNode> datetime_primary datetime_value_fct time_zone time_zone_specifier /*interval_term*/ interval_qualifier
276 %type <pParseNode> start_field non_second_datetime_field end_field single_datetime_field extract_field datetime_field time_zone_field
277 %type <pParseNode> extract_source char_length_exp octet_length_exp bit_length_exp select_sublist string_value_exp
278 %type <pParseNode> char_value_exp concatenation char_factor char_primary string_value_fct char_substring_fct fold
279 %type <pParseNode> form_conversion char_translation trim_fct trim_operands trim_spec bit_value_fct bit_substring_fct op_column_commalist
280 %type <pParseNode> /*bit_concatenation*/ bit_value_exp bit_factor bit_primary collate_clause char_value_fct unique_spec value_exp_commalist in_predicate_value unique_test update_source
281 %type <pParseNode> function_arg_commalist3 string_function_3Argument function_arg_commalist4 string_function_4Argument function_arg_commalist2 string_function_1Argument string_function_2Argument
282 %type <pParseNode> date_function_0Argument date_function_1Argument function_name12 function_name23 function_name1 function_name2 function_name3 function_name0 numeric_function_0Argument numeric_function_1Argument numeric_function_2Argument
283 %type <pParseNode> all query_primary sql_not for_length upper_lower comparison column_val  cross_union /*opt_schema_element_list*/
284 %type <pParseNode> /*op_authorization op_schema*/ nil_fkt schema_element base_table_def base_table_element base_table_element_commalist
285 %type <pParseNode> column_def odbc_fct_spec odbc_call_spec odbc_fct_type op_parameter union_statement
286 %type <pParseNode> op_odbc_call_parameter odbc_parameter_commalist odbc_parameter function_args_commalist function_arg
287 %type <pParseNode> catalog_name schema_name table_node numeric_function string_function function_name date_function table_primary_as_range_column opt_as
288 %type <pParseNode> ordered_set_function inverse_distribution_function hypothetical_set_function hypothetical_set_function_value_expression_list rank_function_type within_group_specification inverse_distribution_function_type array_aggregate_function inverse_distribution_function_argument
289 %type <pParseNode> case_expression else_clause result_expression result case_abbreviation case_specification searched_when_clause simple_when_clause searched_case simple_case
290 %type <pParseNode> when_operand_list when_operand case_operand
291 %type <pParseNode> trigger_definition trigger_name trigger_action_time trigger_event transition_table_or_variable_list triggered_action trigger_column_list triggered_when_clause triggered_SQL_statement SQL_procedure_statement old_transition_variable_name new_transition_variable_name
292 %type <pParseNode> op_referencing op_trigger_columnlist op_triggered_action_for opt_row trigger_for SQL_procedure_statement_list transition_table_or_variable old_transition_table_name new_transition_table_name transition_table_name
293 %type <pParseNode> searched_when_clause_list simple_when_clause_list predefined_type opt_char_set_spec opt_collate_clause character_string_type national_character_string_type
294 %type <pParseNode> binary_string_type numeric_type boolean_type datetime_type interval_type opt_paren_precision paren_char_length opt_paren_char_large_length paren_character_large_object_length
295 %type <pParseNode> large_object_length opt_multiplier character_large_object_type national_character_large_object_type binary_large_object_string_type opt_with_or_without_time_zone
296 %type <pParseNode> approximate_numeric_type exact_numeric_type opt_paren_precision_scale
297 /* window function rules */
298 %type <pParseNode> window_function window_function_type ntile_function number_of_tiles lead_or_lag_function lead_or_lag lead_or_lag_extent offset default_expression null_treatment
299 %type <pParseNode> first_or_last_value_function first_or_last_value nth_value_function nth_row from_first_or_last window_name_or_specification in_line_window_specification opt_lead_or_lag_function
300 %type <pParseNode> opt_null_treatment opt_from_first_or_last simple_value_specification dynamic_parameter_specification window_name window_clause window_definition_list window_definition
301 %type <pParseNode> new_window_name window_specification_details existing_window_name window_partition_clause window_partition_column_reference_list window_partition_column_reference window_frame_clause
302 %type <pParseNode> window_frame_units window_frame_extent window_frame_start window_frame_preceding window_frame_between window_frame_bound_1 window_frame_bound_2 window_frame_bound window_frame_following window_frame_exclusion
303 %type <pParseNode> opt_window_frame_clause opt_window_partition_clause opt_existing_window_name window_specification opt_window_frame_exclusion opt_window_clause opt_offset
304 %type <pParseNode> opt_fetch_first_row_count fetch_first_clause offset_row_count fetch_first_row_count first_or_next row_or_rows opt_result_offset_clause result_offset_clause
305 /* LIMIT and OFFSET */
306 %type <pParseNode> opt_limit_offset_clause limit_offset_clause opt_fetch_first_clause
307 %%
308 
309 /* Parse Tree an OSQLParser zurueckliefern
310  * (der Zugriff ueber yyval nach Aufruf des Parsers scheitert,
311  *
312  */
313 sql_single_statement:
314         sql
315         { xxx_pGLOBAL_SQLPARSER->setParseTree( $1 ); }
316     |   sql ';'
317         { xxx_pGLOBAL_SQLPARSER->setParseTree( $1 ); }
318     ;
319 
320     /* schema definition language */
321     /* Note: other ``sql:sal_Unicode() rules appear later in the grammar */
322 
323 sql:
324         manipulative_statement
325     |   schema_element
326            {
327                 $$ = SQL_NEW_RULE;
328         $$->append($1);
329        }
330     ;
331 
332 /***
333 
334 op_authorization:
335         {$$ = SQL_NEW_RULE;}
336     |   SQL_TOKEN_AUTHORIZATION user
337         {
338             $$ = SQL_NEW_RULE;
339             $$->append($1);
340             $$->append($2);
341         }
342     ;
343 op_schema:
344         {$$ = SQL_NEW_RULE;}
345     |   SQL_TOKEN_NAME
346     |   SQL_TOKEN_NAME '.' SQL_TOKEN_NAME
347         {
348             $$ = SQL_NEW_RULE;
349             $$->append($1);
350             $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
351             $$->append($3);
352         }
353     ;
354 
355 schema:
356         SQL_TOKEN_CREATE SQL_TOKEN_SCHEMA op_schema op_authorization opt_schema_element_list
357         {
358             $$ = SQL_NEW_RULE;
359             $$->append($1);
360             $$->append($2);
361             $$->append($3);
362             $$->append($4);
363             $$->append($5);
364         }
365     ;
366 
367 opt_schema_element_list:
368             {$$ = SQL_NEW_RULE;}
369     |       schema_glement_list
370     ;
371 
372 schema_element_list:
373         schema_element
374             {$$ = SQL_NEW_LISTRULE;
375             $$->append($1);}
376     |       schema_element_list schema_element
377             {$1->append($2);
378             $$ = $1;}
379     ;
380 */
381 
382 schema_element:
383             base_table_def
384     |       view_def
385     |       privilege_def
386     |       trigger_definition
387     ;
388 
389 base_table_def:
390         SQL_TOKEN_CREATE SQL_TOKEN_TABLE table_node '(' base_table_element_commalist ')'
391         {$$ = SQL_NEW_RULE;
392         $$->append($1);
393         $$->append($2);
394         $$->append($3);
395         $$->append($4 = newNode("(", SQL_NODE_PUNCTUATION));
396         $$->append($5);
397         $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));}
398     ;
399 
400 base_table_element_commalist:
401         base_table_element
402         {$$ = SQL_NEW_COMMALISTRULE;
403         $$->append($1);}
404     |   base_table_element_commalist ',' base_table_element
405         {$1->append($3);
406         $$ = $1;}
407     ;
408 
409 base_table_element:
410         column_def
411     |   table_constraint_def
412     ;
413 
414 column_def:
415         column data_type column_def_opt_list
416             {$$ = SQL_NEW_RULE;
417             $$->append($1);
418             $$->append($2);
419             $$->append($3);
420             }
421     ;
422 
423 column_def_opt_list:
424         /* empty */                 {$$ = SQL_NEW_LISTRULE;}
425     |       column_def_opt_list column_def_opt
426             {$1->append($2);
427             $$ = $1;}
428     ;
429 
430 nil_fkt:
431     datetime_value_fct
432     ;
433 unique_spec:
434         SQL_TOKEN_UNIQUE
435     |   SQL_TOKEN_PRIMARY SQL_TOKEN_KEY
436         {
437             $$ = SQL_NEW_RULE;
438             $$->append($1);
439             $$->append($2);
440         }
441     ;
442 column_def_opt:
443         SQL_TOKEN_NOT SQL_TOKEN_NULL
444             {$$ = SQL_NEW_RULE;
445             $$->append($1);
446             $$->append($2);}
447     |       unique_spec
448     |       SQL_TOKEN_DEFAULT literal
449             {$$ = SQL_NEW_RULE;
450             $$->append($1);
451             $$->append($2);}
452     |       SQL_TOKEN_DEFAULT SQL_TOKEN_NULL
453             {$$ = SQL_NEW_RULE;
454             $$->append($1);
455             $$->append($2);}
456     |       SQL_TOKEN_DEFAULT SQL_TOKEN_USER
457             {$$ = SQL_NEW_RULE;
458             $$->append($1);
459             $$->append($2);}
460     |       SQL_TOKEN_DEFAULT nil_fkt
461             {
462                 $$ = SQL_NEW_RULE;
463                 $$->append($1);
464                 $$->append($2);
465             }
466     |       SQL_TOKEN_CHECK
467     |       SQL_TOKEN_CHECK '(' search_condition ')'
468             {$$ = SQL_NEW_RULE;
469             $$->append($1);
470             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
471             $$->append($3);
472             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));}
473     |       SQL_TOKEN_REFERENCES table_node
474             {$$ = SQL_NEW_RULE;
475             $$->append($1);
476             $$->append($2);}
477     |       SQL_TOKEN_REFERENCES table_node '(' column_commalist ')'
478             {$$ = SQL_NEW_RULE;
479             $$->append($1);
480             $$->append($2);
481             $$->append($3 = newNode("(", SQL_NODE_PUNCTUATION));
482             $$->append($4);
483             $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));}
484     ;
485 
486 table_constraint_def:
487         unique_spec '(' column_commalist ')'
488             {$$ = SQL_NEW_RULE;
489             $$->append($1);
490             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
491             $$->append($3);
492             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));}
493     |       SQL_TOKEN_FOREIGN SQL_TOKEN_KEY '(' column_commalist ')' SQL_TOKEN_REFERENCES table_node
494             {$$ = SQL_NEW_RULE;
495             $$->append($1);
496             $$->append($2);
497             $$->append($3 = newNode("(", SQL_NODE_PUNCTUATION));
498             $$->append($4);
499             $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
500             $$->append($6);
501             $$->append($7);}
502     |       SQL_TOKEN_FOREIGN SQL_TOKEN_KEY '(' column_commalist ')' SQL_TOKEN_REFERENCES table_node '(' column_commalist ')'
503             {$$ = SQL_NEW_RULE;
504             $$->append($1);
505             $$->append($2);
506             $$->append($3 = newNode("(", SQL_NODE_PUNCTUATION));
507             $$->append($4);
508             $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
509             $$->append($6);
510             $$->append($7);
511             $$->append($8 = newNode("(", SQL_NODE_PUNCTUATION));
512             $$->append($9);
513             $$->append($10 = newNode(")", SQL_NODE_PUNCTUATION));}
514     |       SQL_TOKEN_CHECK '(' search_condition ')'
515             {$$ = SQL_NEW_RULE;
516             $$->append($1);
517             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
518             $$->append($3);
519             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));}
520     ;
521 op_column_commalist:
522     /* empty */ {$$ = SQL_NEW_RULE;}
523     | '(' column_commalist ')'
524         {$$ = SQL_NEW_RULE;
525             $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
526             $$->append($2);
527             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
528         }
529     ;
530 column_commalist:
531         column_commalist ',' column
532             {$1->append($3);
533             $$ = $1;}
534     |   column
535             {$$ = SQL_NEW_COMMALISTRULE;
536             $$->append($1);}
537     ;
538 
539 view_def:
540         SQL_TOKEN_CREATE SQL_TOKEN_VIEW table_node opt_column_commalist SQL_TOKEN_AS select_statement opt_with_check_option
541             {$$ = SQL_NEW_RULE;
542             $$->append($1);
543             $$->append($2);
544             $$->append($3);
545             $$->append($4);
546             $$->append($5);
547             $$->append($6);
548             $$->append($7);}
549     ;
550 
551 opt_with_check_option:
552         /* empty */         {$$ = SQL_NEW_RULE;}
553     |       SQL_TOKEN_WITH SQL_TOKEN_CHECK SQL_TOKEN_OPTION
554             {$$ = SQL_NEW_RULE;
555             $$->append($1);
556             $$->append($2);
557             $$->append($3);}
558     ;
559 
560 opt_column_commalist:
561         /* empty */         {$$ = SQL_NEW_RULE;}
562     |       '(' column_commalist ')'
563             {$$ = SQL_NEW_RULE;
564             $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
565             $$->append($2);
566             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));}
567     ;
568 
569 privilege_def:
570         SQL_TOKEN_GRANT privileges SQL_TOKEN_ON table_node SQL_TOKEN_TO grantee_commalist
571         opt_with_grant_option
572             {$$ = SQL_NEW_RULE;
573             $$->append($1);
574             $$->append($2);
575             $$->append($3);
576             $$->append($4);
577             $$->append($5);
578             $$->append($6);
579             $$->append($7);}
580     ;
581 
582 opt_with_grant_option:
583         /* empty */         {$$ = SQL_NEW_RULE;}
584     |       SQL_TOKEN_WITH SQL_TOKEN_GRANT SQL_TOKEN_OPTION
585             {$$ = SQL_NEW_RULE;
586             $$->append($1);
587             $$->append($2);
588             $$->append($3);}
589     ;
590 
591 privileges:
592         SQL_TOKEN_ALL SQL_TOKEN_PRIVILEGES
593             {$$ = SQL_NEW_RULE;
594             $$->append($1);
595             $$->append($2);}
596     |       operation_commalist
597     ;
598 
599 operation_commalist:
600         operation
601             {$$ = SQL_NEW_COMMALISTRULE;
602             $$->append($1);}
603     |       operation_commalist ',' operation
604             {$1->append($3);
605             $$ = $1;}
606     ;
607 
608 operation:
609             SQL_TOKEN_SELECT
610     |       SQL_TOKEN_INSERT opt_column_commalist
611             {$$ = SQL_NEW_RULE;
612             $$->append($1);
613             $$->append($2);}
614     |       SQL_TOKEN_DELETE
615     |       SQL_TOKEN_UPDATE opt_column_commalist
616             {$$ = SQL_NEW_RULE;
617             $$->append($1);
618             $$->append($2);}
619     |       SQL_TOKEN_REFERENCES opt_column_commalist
620             {$$ = SQL_NEW_RULE;
621             $$->append($1);
622             $$->append($2);}
623     |       SQL_TOKEN_USAGE
624     ;
625 
626 
627 grantee_commalist:
628         grantee
629             {$$ = SQL_NEW_COMMALISTRULE;
630             $$->append($1);}
631     |       grantee_commalist ',' grantee
632             {$1->append($3);
633             $$ = $1;}
634     ;
635 
636 grantee:
637             SQL_TOKEN_PUBLIC
638     |       user
639     ;
640 
641     /* module language */
642 
643 opt_order_by_clause:
644         /* empty */         {$$ = SQL_NEW_RULE;}
645     |       SQL_TOKEN_ORDER SQL_TOKEN_BY ordering_spec_commalist
646             {$$ = SQL_NEW_RULE;
647             $$->append($1);
648             $$->append($2);
649             $$->append($3);}
650     ;
651 
652 ordering_spec_commalist:
653         ordering_spec
654             {$$ = SQL_NEW_COMMALISTRULE;
655             $$->append($1);}
656     |       ordering_spec_commalist ',' ordering_spec
657             {$1->append($3);
658             $$ = $1;}
659     ;
660 
661 ordering_spec:
662 /*      SQL_TOKEN_INTNUM opt_asc_desc
663             {$$ = SQL_NEW_RULE;
664             $$->append($1);
665             $$->append($2);}
666 */
667         predicate opt_asc_desc
668             {$$ = SQL_NEW_RULE;
669             $$->append($1);
670             $$->append($2);}
671 
672     |   row_value_constructor_elem opt_asc_desc
673             {$$ = SQL_NEW_RULE;
674             $$->append($1);
675             $$->append($2);}
676     ;
677 
678 opt_asc_desc:
679         {$$ = SQL_NEW_RULE;}
680     |   SQL_TOKEN_ASC
681     |   SQL_TOKEN_DESC
682     ;
683 
684 
685 /***
686 manipulative_statement_list:
687         manipulative_statement
688             {$$ = SQL_NEW_LISTRULE;
689             $$->append($1);}
690     |       manipulative_statement_list manipulative_statement
691             {$1->append($2);
692             $$ = $1;}
693     ;
694 ***/
695 
696 sql_not:
697     {$$ = SQL_NEW_RULE;}
698     |   SQL_TOKEN_NOT
699     ;
700 
701 /* manipulative statements */
702 
703 manipulative_statement:
704             commit_statement
705 /*  |       delete_statement_positioned*/
706     |       delete_statement_searched
707     |       fetch_statement
708     |       insert_statement
709     |       rollback_statement
710     |       select_statement_into
711 /*  |       update_statement_positioned*/
712     |       update_statement_searched
713     |       union_statement
714     |       '{' odbc_call_spec '}'
715         {
716             $$ = SQL_NEW_RULE;
717             $$->append($1 = newNode("{", SQL_NODE_PUNCTUATION));
718             $$->append($2);
719             $$->append($3 = newNode("}", SQL_NODE_PUNCTUATION));
720         }
721     ;
722 
723 union_statement:
724             select_statement
725     |       union_statement SQL_TOKEN_UNION all select_statement
726         {
727             $$ = SQL_NEW_RULE;
728             $$->append($1);
729             $$->append($2);
730             $$->append($3);
731             $$->append($4);
732         }
733     ;
734 commit_statement:
735         SQL_TOKEN_COMMIT SQL_TOKEN_WORK
736             {$$ = SQL_NEW_RULE;
737             $$->append($1);
738             $$->append($2);}
739     ;
740 /*
741 delete_statement_positioned:
742         SQL_TOKEN_DELETE SQL_TOKEN_FROM table_node SQL_TOKEN_WHERE SQL_TOKEN_CURRENT SQL_TOKEN_OF cursor
743             {$$ = SQL_NEW_RULE;
744             $$->append($1);
745             $$->append($2);
746             $$->append($3);
747             $$->append($4);
748             $$->append($5);
749             $$->append($6);
750             $$->append($7);}
751     ;
752 */
753 delete_statement_searched:
754         SQL_TOKEN_DELETE SQL_TOKEN_FROM table_node opt_where_clause
755             {$$ = SQL_NEW_RULE;
756             $$->append($1);
757             $$->append($2);
758             $$->append($3);
759             $$->append($4);}
760     ;
761 
762 fetch_statement:
763         SQL_TOKEN_FETCH cursor SQL_TOKEN_INTO target_commalist
764             {$$ = SQL_NEW_RULE;
765             $$->append($1);
766             $$->append($2);
767             $$->append($3);
768             $$->append($4);}
769     ;
770 
771 insert_statement:
772         SQL_TOKEN_INSERT SQL_TOKEN_INTO table_node opt_column_commalist values_or_query_spec
773             {$$ = SQL_NEW_RULE;
774             $$->append($1);
775             $$->append($2);
776             $$->append($3);
777             $$->append($4);
778             $$->append($5);}
779     ;
780 values_or_query_spec:
781         SQL_TOKEN_VALUES '(' table_value_const_list ')'
782         {$$ = SQL_NEW_RULE;
783             $$->append($1);
784             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
785             $$->append($3);
786             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
787         }
788     ;
789 
790 table_value_const_list:
791             row_value_constructor
792             {$$ = SQL_NEW_COMMALISTRULE;
793             $$->append($1);}
794     |       table_value_const_list ',' row_value_constructor
795             {$1->append($3);
796             $$ = $1;}
797     ;
798 row_value_const_list:
799             row_value_constructor_elem
800             {$$ = SQL_NEW_COMMALISTRULE;
801             $$->append($1);}
802     |       row_value_const_list ',' row_value_constructor_elem
803             {$1->append($3);
804             $$ = $1;}
805     ;
806 row_value_constructor:
807             row_value_constructor_elem
808 /*    |     '(' row_value_const_list ')'
809             {
810                 $$ = SQL_NEW_RULE;
811                 $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
812                 $$->append($2);
813                 $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
814             }
815             */
816     ;
817 row_value_constructor_elem:
818             value_exp /*[^')']*/
819     |       SQL_TOKEN_DEFAULT
820     ;
821 
822 
823 rollback_statement:
824         SQL_TOKEN_ROLLBACK SQL_TOKEN_WORK
825             {$$ = SQL_NEW_RULE;
826             $$->append($1);
827             $$->append($2);}
828     ;
829 
830 
831         /* INTO target_commalist herausgenommen */
832 select_statement_into:
833         SQL_TOKEN_SELECT opt_all_distinct selection SQL_TOKEN_INTO target_commalist table_exp
834             {$$ = SQL_NEW_RULE;
835             $$->append($1);
836             $$->append($2);
837             $$->append($3);
838             $$->append($4);
839             $$->append($5);
840             $$->append($6); }
841     ;
842 
843 opt_all_distinct:
844             {$$ = SQL_NEW_RULE;}
845         |   SQL_TOKEN_ALL
846         |   SQL_TOKEN_DISTINCT
847 
848     ;
849 /*
850 update_statement_positioned:
851         SQL_TOKEN_UPDATE table_node SQL_TOKEN_SET assignment_commalist
852         SQL_TOKEN_WHERE SQL_TOKEN_CURRENT SQL_TOKEN_OF cursor
853             {$$ = SQL_NEW_RULE;
854             $$->append($1);
855             $$->append($2);
856             $$->append($3);
857             $$->append($4);
858             $$->append($5);
859             $$->append($6);
860             $$->append($7);
861             $$->append($8);}
862     ;
863 */
864 assignment_commalist:
865             assignment
866             {$$ = SQL_NEW_COMMALISTRULE;
867             $$->append($1);}
868     |       assignment_commalist ',' assignment
869             {$1->append($3);
870             $$ = $1;}
871     ;
872 
873 assignment:
874         column SQL_EQUAL update_source
875             {$$ = SQL_NEW_RULE;
876             $$->append($1);
877             $$->append($2);
878             $$->append($3);}
879     ;
880 update_source:
881         value_exp
882       | SQL_TOKEN_DEFAULT
883     ;
884 update_statement_searched:
885         SQL_TOKEN_UPDATE table_node SQL_TOKEN_SET assignment_commalist opt_where_clause
886             {$$ = SQL_NEW_RULE;
887             $$->append($1);
888             $$->append($2);
889             $$->append($3);
890             $$->append($4);
891             $$->append($5);}
892     ;
893 
894 target_commalist:
895         target
896             {$$ = SQL_NEW_COMMALISTRULE;
897             $$->append($1);}
898     |       target_commalist ',' target
899             {$1->append($3);
900             $$ = $1;}
901     ;
902 
903 target:
904         parameter_ref
905     ;
906 
907 opt_where_clause:
908         /* empty */             {$$ = SQL_NEW_RULE;}
909     |       where_clause
910     ;
911 
912     /* query expressions */
913 
914 query_term:
915         non_join_query_term
916         {
917             $$ = SQL_NEW_RULE;
918             $$->append($1);
919         }
920     ;
921 /* SELECT STATEMENT */
922 select_statement:
923         SQL_TOKEN_SELECT opt_all_distinct selection table_exp
924         {
925             $$ = SQL_NEW_RULE;
926             $$->append($1);
927             $$->append($2);
928             $$->append($3);
929             $$->append($4);
930         }
931     ;
932 
933 selection:
934         '*'
935         {
936             $$ = SQL_NEW_RULE;
937             $$->append($1 = newNode("*", SQL_NODE_PUNCTUATION));
938         }
939     |   scalar_exp_commalist
940     ;
941 opt_result_offset_clause:
942         /* empty */ {$$ = SQL_NEW_RULE;}
943     |   result_offset_clause
944     ;
945 result_offset_clause:
946     SQL_TOKEN_OFFSET offset_row_count row_or_rows
947     {
948         $$ = SQL_NEW_RULE;
949         $$->append($1);
950         $$->append($2);
951         $$->append($3);
952     }
953     ;
954 opt_fetch_first_row_count:
955         /* empty */ {$$ = SQL_NEW_RULE;}
956     |   fetch_first_row_count
957     ;
958 first_or_next:
959         SQL_TOKEN_FIRST
960     |   SQL_TOKEN_NEXT
961     ;
962 row_or_rows:
963         SQL_TOKEN_ROW
964     |   SQL_TOKEN_ROWS
965     ;
966 opt_fetch_first_clause:
967         /* empty */ {$$ = SQL_NEW_RULE;}
968     |   fetch_first_clause
969     ;
970 fetch_first_clause:
971     SQL_TOKEN_FETCH first_or_next opt_fetch_first_row_count row_or_rows SQL_TOKEN_ONLY
972     {
973         $$ = SQL_NEW_RULE;
974         $$->append($1);
975         $$->append($2);
976         $$->append($3);
977         $$->append($4);
978         $$->append($5);
979     }
980     ;
981 offset_row_count:
982     literal
983     ;
984 fetch_first_row_count:
985     literal
986     ;
987 
988 opt_limit_offset_clause:
989         /* empty */ {$$ = SQL_NEW_RULE;}
990     |   limit_offset_clause
991     ;
992 opt_offset:
993         /* empty */ {$$ = SQL_NEW_RULE;}
994     |   SQL_TOKEN_OFFSET SQL_TOKEN_INTNUM
995     {
996         $$ = SQL_NEW_RULE;
997         $$->append($1);
998         $$->append($2);
999     }
1000     ;
1001 limit_offset_clause:
1002     SQL_TOKEN_LIMIT SQL_TOKEN_INTNUM opt_offset
1003     {
1004         $$ = SQL_NEW_RULE;
1005         $$->append($1);
1006         $$->append($2);
1007         $$->append($3);
1008     }
1009     ;
1010 table_exp:
1011         from_clause opt_where_clause opt_group_by_clause opt_having_clause opt_window_clause opt_order_by_clause opt_limit_offset_clause opt_result_offset_clause opt_fetch_first_clause
1012         {
1013             $$ = SQL_NEW_RULE;
1014             $$->append($1);
1015             $$->append($2);
1016             $$->append($3);
1017             $$->append($4);
1018             $$->append($5);
1019             $$->append($6);
1020             $$->append($7);
1021             $$->append($8);
1022             $$->append($9);
1023         }
1024     ;
1025 
1026 from_clause:
1027         SQL_TOKEN_FROM table_ref_commalist
1028             {$$ = SQL_NEW_RULE;
1029             $$->append($1);
1030             $$->append($2);}
1031     ;
1032 
1033 table_ref_commalist:
1034 
1035         table_ref
1036             {$$ = SQL_NEW_COMMALISTRULE;
1037             $$->append($1);}
1038     |       table_ref_commalist ',' table_ref
1039             {$1->append($3);
1040             $$ = $1;}
1041     ;
1042 
1043 opt_as:
1044         /* empty */ {$$ = SQL_NEW_RULE;}
1045     |   SQL_TOKEN_AS
1046     ;
1047 opt_row:
1048         /* empty */ {$$ = SQL_NEW_RULE;}
1049     |   SQL_TOKEN_ROW
1050     ;
1051 table_primary_as_range_column:
1052         {$$ = SQL_NEW_RULE;}
1053     |   opt_as SQL_TOKEN_NAME op_column_commalist
1054         {$$ = SQL_NEW_RULE;
1055             $$->append($1);
1056             $$->append($2);
1057             $$->append($3);
1058         }
1059     ;
1060 table_ref:
1061         table_node table_primary_as_range_column
1062         {
1063             $$ = SQL_NEW_RULE;
1064             $$->append($1);
1065             $$->append($2);
1066         }
1067     |   subquery range_variable op_column_commalist
1068         {
1069             $$ = SQL_NEW_RULE;
1070             $$->append($1);
1071             $$->append($2);
1072             $$->append($3);
1073         }
1074     |   joined_table
1075     |   '{' SQL_TOKEN_OJ joined_table '}'
1076         {
1077             $$ = SQL_NEW_RULE;
1078             $$->append($1 = newNode("{", SQL_NODE_PUNCTUATION));
1079             $$->append($2);
1080             $$->append($3);
1081             $$->append($4 = newNode("}", SQL_NODE_PUNCTUATION));
1082         }
1083     |   '(' joined_table ')'
1084         {
1085             $$ = SQL_NEW_RULE;
1086             $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
1087             $$->append($2);
1088             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
1089         }
1090     ;
1091 where_clause:
1092         SQL_TOKEN_WHERE search_condition
1093             {$$ = SQL_NEW_RULE;
1094             $$->append($1);
1095             $$->append($2);}
1096     ;
1097 
1098 opt_group_by_clause:
1099         /* empty */      {$$ = SQL_NEW_RULE;}
1100     |   SQL_TOKEN_GROUP SQL_TOKEN_BY column_ref_commalist
1101             {$$ = SQL_NEW_RULE;
1102             $$->append($1);
1103             $$->append($2);
1104             $$->append($3);}
1105     ;
1106 
1107 column_ref_commalist:
1108         column_ref
1109             {$$ = SQL_NEW_COMMALISTRULE;
1110             $$->append($1);}
1111     |   set_fct_spec
1112         {$$ = SQL_NEW_COMMALISTRULE;
1113             $$->append($1);}
1114     |   column_ref_commalist ',' column_ref
1115             {$1->append($3);
1116             $$ = $1;}
1117     |   column_ref_commalist ',' set_fct_spec
1118             {$1->append($3);
1119             $$ = $1;}
1120     ;
1121 
1122 opt_having_clause:
1123         /* empty */                 {$$ = SQL_NEW_RULE;}
1124     |       SQL_TOKEN_HAVING search_condition
1125             {$$ = SQL_NEW_RULE;
1126             $$->append($1);
1127             $$->append($2);}
1128     ;
1129 
1130     /* search conditions */
1131 truth_value:
1132         SQL_TOKEN_TRUE
1133       | SQL_TOKEN_FALSE
1134       | SQL_TOKEN_UNKNOWN
1135       | SQL_TOKEN_NULL
1136       ;
1137 boolean_primary:
1138         predicate
1139     |   '(' search_condition ')'
1140         { // boolean_primary: rule 2
1141             $$ = SQL_NEW_RULE;
1142             $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
1143             $$->append($2);
1144             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
1145         }
1146     |   row_value_constructor_elem  /*[^')' ',']*/
1147         {
1148             if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck())// boolean_primary: rule 3
1149             {
1150                 $$ = SQL_NEW_RULE;
1151                 sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildComparsionRule($$,$1);
1152                 if(nErg == 1)
1153                 {
1154                     OSQLParseNode* pTemp = $$;
1155                     $$ = pTemp->removeAt((sal_uInt32)0);
1156                     delete pTemp;
1157                 }
1158                 else
1159                 {
1160                     delete $$;
1161                     if(nErg)
1162                         YYERROR;
1163                     else
1164                         YYABORT;
1165                 }
1166             }
1167             else
1168                 YYERROR;
1169         }
1170     ;
1171 parenthesized_boolean_value_expression:
1172    '(' search_condition ')'
1173     { // boolean_primary: rule 2
1174         $$ = SQL_NEW_RULE;
1175         $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
1176         $$->append($2);
1177         $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
1178     }
1179     ;
1180 boolean_test:
1181         boolean_primary
1182     |   boolean_primary SQL_TOKEN_IS sql_not truth_value
1183         {
1184             $$ = SQL_NEW_RULE;
1185             $$->append($1);
1186             $$->append($2);
1187             $$->append($3);
1188             $$->append($4);
1189         }
1190     ;
1191 boolean_factor:
1192         boolean_test
1193     |   SQL_TOKEN_NOT boolean_test
1194         { // boolean_factor: rule 1
1195             $$ = SQL_NEW_RULE;
1196             $$->append($1);
1197             $$->append($2);
1198         }
1199     ;
1200 boolean_term:
1201         boolean_factor
1202     |   boolean_term SQL_TOKEN_AND boolean_factor
1203         {
1204             $$ = SQL_NEW_RULE; // boolean_term: rule 1
1205             $$->append($1);
1206             $$->append($2);
1207             $$->append($3);
1208         }
1209     ;
1210 search_condition:
1211         boolean_term
1212     |   search_condition SQL_TOKEN_OR boolean_term
1213         {
1214             $$ = SQL_NEW_RULE; // search_condition
1215             $$->append($1);
1216             $$->append($2);
1217             $$->append($3);
1218         }
1219     ;
1220 predicate:
1221         comparison_predicate
1222     |       between_predicate
1223     |       all_or_any_predicate
1224     |       existence_test
1225     |       unique_test
1226     |       test_for_null
1227     |       in_predicate
1228     |       like_predicate
1229     ;
1230 comparison_predicate_part_2:
1231         comparison row_value_constructor
1232         {
1233             $$ = SQL_NEW_RULE; // comparison_predicate: rule 1
1234             $$->append($1);
1235             $$->append($2);
1236         }
1237 comparison_predicate:
1238         row_value_constructor comparison row_value_constructor
1239         {
1240             $$ = SQL_NEW_RULE; // comparison_predicate: rule 1
1241             $$->append($1);
1242             $$->append($2);
1243             $$->append($3);
1244         }
1245     |   comparison row_value_constructor
1246         {
1247             if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // comparison_predicate: rule 2
1248             {
1249                 $$ = SQL_NEW_RULE;
1250                 sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildPredicateRule($$,$2,$1);
1251                 if(nErg == 1)
1252                 {
1253                     OSQLParseNode* pTemp = $$;
1254                     $$ = pTemp->removeAt((sal_uInt32)0);
1255                     delete pTemp;
1256                 }
1257                 else
1258                 {
1259                     delete $$;
1260                     YYABORT;
1261                 }
1262             }
1263             else
1264             {
1265                 YYERROR;
1266             }
1267         }
1268     ;
1269 comparison:
1270         SQL_LESS
1271       | SQL_NOTEQUAL
1272       | SQL_EQUAL
1273       | SQL_GREAT
1274       | SQL_LESSEQ
1275       | SQL_GREATEQ
1276     ;
1277 between_predicate_part_2:
1278     sql_not SQL_TOKEN_BETWEEN row_value_constructor SQL_TOKEN_AND row_value_constructor
1279         {
1280             if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // between_predicate: rule 2
1281             {
1282                 $$ = SQL_NEW_RULE;
1283 
1284                 sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildPredicateRule($$,$3,$2,$5);
1285                 if(nErg == 1)
1286                 {
1287                     OSQLParseNode* pTemp = $$;
1288                     $$ = pTemp->removeAt((sal_uInt32)0);
1289                     OSQLParseNode* pColumnRef = $$->removeAt((sal_uInt32)0);
1290                     $$->insert(0,$1);
1291                     OSQLParseNode* pBetween_predicate = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::between_predicate));
1292                     pBetween_predicate->append(pColumnRef);
1293                     pBetween_predicate->append($$);
1294                     $$ = pBetween_predicate;
1295 
1296                     delete pTemp;
1297                     delete $4;
1298                 }
1299                 else
1300                 {
1301                     delete $$;
1302                     YYABORT;
1303                 }
1304             }
1305             else
1306             {
1307                 $$ = SQL_NEW_RULE; // between_predicate: rule 1
1308                 $$->append($1);
1309                 $$->append($2);
1310                 $$->append($3);
1311                 $$->append($4);
1312                 $$->append($5);
1313             }
1314         }
1315 between_predicate:
1316         row_value_constructor between_predicate_part_2
1317         {
1318             $$ = SQL_NEW_RULE; // between_predicate: rule 1
1319             $$->append($1);
1320             $$->append($2);
1321         }
1322     |   between_predicate_part_2
1323     ;
1324 character_like_predicate_part_2:
1325     sql_not SQL_TOKEN_LIKE string_value_exp opt_escape
1326         {
1327             $$ = SQL_NEW_RULE; // like_predicate: rule 1
1328             $$->append($1);
1329             $$->append($2);
1330             $$->append($3);
1331             $$->append($4);
1332         }
1333     ;
1334 other_like_predicate_part_2:
1335     sql_not SQL_TOKEN_LIKE value_exp_primary opt_escape
1336         {
1337             $$ = SQL_NEW_RULE; // like_predicate: rule 1
1338             $$->append($1);
1339             $$->append($2);
1340             $$->append($3);
1341             $$->append($4);
1342         }
1343     ;
1344 like_predicate:
1345         row_value_constructor character_like_predicate_part_2
1346         {
1347             $$ = SQL_NEW_RULE; // like_predicate: rule 1
1348             $$->append($1);
1349             $$->append($2);
1350         }
1351     |   row_value_constructor other_like_predicate_part_2
1352         {
1353             $$ = SQL_NEW_RULE;  // like_predicate: rule 3
1354             $$->append($1);
1355             $$->append($2);
1356         }
1357     |   character_like_predicate_part_2
1358         {
1359             if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())  // like_predicate: rule 5
1360             {
1361                 OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
1362                 pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME));
1363 
1364                 $$ = SQL_NEW_RULE;
1365                 $$->append(pColumnRef);
1366                 $$->append($1);
1367                 OSQLParseNode* p2nd = $1->removeAt(2);
1368                 OSQLParseNode* p3rd = $1->removeAt(2);
1369                 if ( !xxx_pGLOBAL_SQLPARSER->buildLikeRule($1,p2nd,p3rd) )
1370                 {
1371                     delete $$;
1372                     YYABORT;
1373                 }
1374                 $1->append(p3rd);
1375             }
1376             else
1377                 YYERROR;
1378         }
1379     |   other_like_predicate_part_2
1380         {
1381             if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // like_predicate: rule 6
1382             {
1383                 OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
1384                 pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME));
1385 
1386                 $$ = SQL_NEW_RULE;
1387                 $$->append(pColumnRef);
1388                 $$->append($1);
1389                 OSQLParseNode* p2nd = $1->removeAt(2);
1390                 OSQLParseNode* p3rd = $1->removeAt(2);
1391                 if ( !xxx_pGLOBAL_SQLPARSER->buildLikeRule($1,p2nd,p3rd) )
1392                 {
1393                     delete $$;
1394                     YYABORT;
1395                 }
1396                 $1->append(p3rd);
1397             }
1398             else
1399                 YYERROR;
1400         }
1401     ;
1402 
1403 opt_escape:
1404         /* empty */                 {$$ = SQL_NEW_RULE;}
1405     |   SQL_TOKEN_ESCAPE string_value_exp
1406             {$$ = SQL_NEW_RULE;
1407             $$->append($1);
1408             $$->append($2);}
1409     |   '{' SQL_TOKEN_ESCAPE SQL_TOKEN_STRING '}'
1410         {
1411             $$ = SQL_NEW_RULE;
1412             $$->append($1 = newNode("{", SQL_NODE_PUNCTUATION));
1413             $$->append($2);
1414             $$->append($3);
1415             $$->append($4 = newNode("}", SQL_NODE_PUNCTUATION));
1416         }
1417     ;
1418 
1419 null_predicate_part_2:
1420     SQL_TOKEN_IS sql_not SQL_TOKEN_NULL
1421     {
1422         $$ = SQL_NEW_RULE; // test_for_null: rule 1
1423         $$->append($1);
1424         $$->append($2);
1425         $$->append($3);
1426     }
1427     ;
1428 test_for_null:
1429         row_value_constructor null_predicate_part_2
1430         {
1431             $$ = SQL_NEW_RULE; // test_for_null: rule 1
1432             $$->append($1);
1433             $$->append($2);
1434         }
1435     |   null_predicate_part_2
1436         {
1437             if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())// test_for_null: rule 2
1438             {
1439                 OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
1440                 pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME));
1441 
1442                 $$ = SQL_NEW_RULE;
1443                 $$->append(pColumnRef);
1444                 $$->append($1);
1445             }
1446             else
1447                 YYERROR;
1448         }
1449     ;
1450 in_predicate_value:
1451         subquery
1452         {$$ = SQL_NEW_RULE;
1453             $$->append($1);
1454         }
1455       | '(' value_exp_commalist ')'
1456         {$$ = SQL_NEW_RULE;
1457             $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
1458             $$->append($2);
1459             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
1460         }
1461     ;
1462 in_predicate_part_2:
1463     sql_not SQL_TOKEN_IN in_predicate_value
1464     {
1465         $$ = SQL_NEW_RULE;// in_predicate: rule 1
1466         $$->append($1);
1467         $$->append($2);
1468         $$->append($3);
1469     }
1470     ;
1471 in_predicate:
1472         row_value_constructor in_predicate_part_2
1473         {
1474             $$ = SQL_NEW_RULE;// in_predicate: rule 1
1475             $$->append($1);
1476             $$->append($2);
1477         }
1478     |   in_predicate_part_2
1479         {
1480             if ( xxx_pGLOBAL_SQLPARSER->inPredicateCheck() )// in_predicate: rule 2
1481             {
1482                 OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
1483                 pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME));
1484 
1485                 $$ = SQL_NEW_RULE;
1486                 $$->append(pColumnRef);
1487                 $$->append($1);
1488             }
1489             else
1490                 YYERROR;
1491         }
1492     ;
1493 quantified_comparison_predicate_part_2:
1494     comparison any_all_some subquery
1495     {
1496         $$ = SQL_NEW_RULE;
1497         $$->append($1);
1498         $$->append($2);
1499         $$->append($3);
1500     }
1501     ;
1502 all_or_any_predicate:
1503         row_value_constructor quantified_comparison_predicate_part_2
1504         {
1505             $$ = SQL_NEW_RULE;
1506             $$->append($1);
1507             $$->append($2);
1508         }
1509     |   quantified_comparison_predicate_part_2
1510         {
1511             if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
1512             {
1513                 OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
1514                 pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME));
1515 
1516                 $$ = SQL_NEW_RULE;
1517                 $$->append(pColumnRef);
1518                 $$->append($1);
1519             }
1520             else
1521                 YYERROR;
1522         }
1523     ;
1524 
1525 any_all_some:
1526             SQL_TOKEN_ANY
1527     |       SQL_TOKEN_ALL
1528     |       SQL_TOKEN_SOME
1529     ;
1530 
1531 existence_test:
1532         SQL_TOKEN_EXISTS subquery
1533             {$$ = SQL_NEW_RULE;
1534             $$->append($1);
1535             $$->append($2);}
1536     ;
1537 unique_test:
1538         SQL_TOKEN_UNIQUE subquery
1539         {$$ = SQL_NEW_RULE;
1540             $$->append($1);
1541             $$->append($2);}
1542     ;
1543 subquery:
1544         '(' query_exp ')'
1545             {$$ = SQL_NEW_RULE;
1546             $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
1547             $$->append($2);
1548             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));}
1549     ;
1550 
1551     /* scalar expressions */
1552 scalar_exp_commalist:
1553         select_sublist
1554         {
1555             $$ = SQL_NEW_COMMALISTRULE;
1556             $$->append($1);
1557         }
1558     |   scalar_exp_commalist ',' select_sublist
1559         {
1560             $1->append($3);
1561             $$ = $1;
1562         }
1563     ;
1564 select_sublist:
1565 /*      table_node '.' '*'
1566         {
1567             $$ = SQL_NEW_RULE;
1568             $$->append($1);
1569             $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
1570             $$->append($3 = newNode("*", SQL_NODE_PUNCTUATION));
1571         }
1572 */
1573         derived_column
1574 
1575     ;
1576 
1577 parameter_ref:
1578         parameter
1579     ;
1580 
1581 /*
1582 op_like:
1583         '*'
1584         {
1585             $$ = newNode("*", SQL_NODE_PUNCTUATION);
1586         }
1587     |   '?'
1588         {
1589             $$ = newNode("?", SQL_NODE_PUNCTUATION);
1590         }
1591     |   op_like '*'
1592         {
1593             $$ = SQL_NEW_RULE;
1594             $$->append($1);
1595             $$->append($2 = newNode("*", SQL_NODE_PUNCTUATION));
1596             xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_False);
1597         }
1598     |   op_like '?'
1599         {
1600             $$ = SQL_NEW_RULE;
1601             $$->append($1);
1602             $$->append($2 = newNode("?", SQL_NODE_PUNCTUATION));
1603             xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_False);
1604         }
1605     ;
1606 */
1607 
1608 literal:
1609 /*      SQL_TOKEN_STRING
1610     |   */SQL_TOKEN_INT
1611     |   SQL_TOKEN_REAL_NUM
1612     |   SQL_TOKEN_INTNUM
1613     |   SQL_TOKEN_APPROXNUM
1614     |   SQL_TOKEN_ACCESS_DATE
1615 /*  rules for predicate check */
1616     |   literal SQL_TOKEN_STRING
1617         {
1618             if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
1619             {
1620                 $$ = SQL_NEW_RULE;
1621                 $$->append($1);
1622                 $$->append($2);
1623                 xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_True);
1624             }
1625             else
1626                 YYERROR;
1627         }
1628     |   literal SQL_TOKEN_INT
1629         {
1630             if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
1631             {
1632                 $$ = SQL_NEW_RULE;
1633                 $$->append($1);
1634                 $$->append($2);
1635                 xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_True);
1636             }
1637             else
1638                 YYERROR;
1639         }
1640     |   literal SQL_TOKEN_REAL_NUM
1641         {
1642             if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
1643             {
1644                 $$ = SQL_NEW_RULE;
1645                 $$->append($1);
1646                 $$->append($2);
1647                 xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_True);
1648             }
1649             else
1650                 YYERROR;
1651         }
1652     |   literal SQL_TOKEN_APPROXNUM
1653         {
1654             if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
1655             {
1656                 $$ = SQL_NEW_RULE;
1657                 $$->append($1);
1658                 $$->append($2);
1659                 xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_True);
1660             }
1661             else
1662                 YYERROR;
1663         }
1664     ;
1665 
1666     /* miscellaneous */
1667 as_clause:
1668         /* empty */ {$$ = SQL_NEW_RULE;}
1669     |   SQL_TOKEN_AS column
1670         {
1671             $$ = SQL_NEW_RULE;
1672             $$->append($1);
1673             $$->append($2);
1674         }
1675     |   column
1676     ;
1677 position_exp:
1678         SQL_TOKEN_POSITION '(' value_exp SQL_TOKEN_IN value_exp ')'
1679         {
1680             $$ = SQL_NEW_RULE;
1681             $$->append($1);
1682             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1683             $$->append($3);
1684             $$->append($4);
1685             $$->append($5);
1686             $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
1687         }
1688     |   SQL_TOKEN_POSITION '(' value_exp_commalist ')'
1689         {
1690             $$ = SQL_NEW_RULE;
1691             $$->append($1);
1692             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1693             $$->append($3);
1694             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
1695         }
1696     ;
1697 num_value_fct:
1698         position_exp
1699     |   extract_exp
1700     |   length_exp
1701     ;
1702 char_length_exp:
1703         SQL_TOKEN_CHAR_LENGTH '(' value_exp ')'
1704         {
1705             $$ = SQL_NEW_RULE;
1706             $$->append($1);
1707             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1708             $$->append($3);
1709             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
1710         }
1711     |   SQL_TOKEN_SQL_TOKEN_INTNUM '(' value_exp ')'
1712         {
1713             $$ = SQL_NEW_RULE;
1714             $$->append($1);
1715             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1716             $$->append($3);
1717             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
1718         }
1719 
1720     ;
1721 octet_length_exp:
1722         SQL_TOKEN_OCTET_LENGTH '(' value_exp ')'
1723         {
1724             $$ = SQL_NEW_RULE;
1725             $$->append($1);
1726             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1727             $$->append($3);
1728             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
1729         }
1730     ;
1731 bit_length_exp:
1732         SQL_TOKEN_BIT_LENGTH '(' value_exp ')'
1733         {
1734             $$ = SQL_NEW_RULE;
1735             $$->append($1);
1736             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1737             $$->append($3);
1738             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
1739         }
1740     ;
1741 length_exp:
1742         char_length_exp
1743         {
1744             $$ = SQL_NEW_RULE;
1745             $$->append($1);
1746         }
1747       | octet_length_exp
1748         {
1749             $$ = SQL_NEW_RULE;
1750             $$->append($1);
1751         }
1752       | bit_length_exp
1753         {
1754             $$ = SQL_NEW_RULE;
1755             $$->append($1);
1756         }
1757     ;
1758 datetime_field:
1759         non_second_datetime_field
1760         {
1761             $$ = SQL_NEW_RULE;
1762             $$->append($1);
1763         }
1764       | SQL_TOKEN_SECOND
1765         {
1766             $$ = SQL_NEW_RULE;
1767             $$->append($1);
1768         }
1769     ;
1770 extract_field:
1771        time_zone_field
1772       | datetime_field
1773       | value_exp
1774     ;
1775 time_zone_field:
1776         SQL_TOKEN_TIMEZONE_HOUR
1777         {
1778             $$ = SQL_NEW_RULE;
1779             $$->append($1);
1780         }
1781       | SQL_TOKEN_TIMEZONE_MINUTE
1782         {
1783             $$ = SQL_NEW_RULE;
1784             $$->append($1);
1785         }
1786     ;
1787 extract_source:
1788         datetime_value_exp
1789         {
1790             $$ = SQL_NEW_RULE;
1791             $$->append($1);
1792         }
1793 /*      | interval_value_exp
1794         {
1795             $$ = SQL_NEW_RULE;
1796             $$->append($1);
1797         } */
1798     ;
1799 extract_exp:
1800         SQL_TOKEN_EXTRACT '(' extract_field SQL_TOKEN_FROM value_exp ')'
1801         {
1802             $$ = SQL_NEW_RULE;
1803             $$->append($1);
1804             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1805             $$->append($3);
1806             $$->append($4);
1807             $$->append($5);
1808             $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
1809         }
1810     ;
1811 unsigned_value_spec:
1812         general_value_spec
1813     |   literal
1814     ;
1815 general_value_spec:
1816         parameter
1817     | SQL_TOKEN_USER
1818     /*    | SQL_TOKEN_NULL*/
1819     | SQL_TOKEN_FALSE
1820     | SQL_TOKEN_TRUE
1821     | SQL_TOKEN_VALUE
1822     | SQL_TOKEN_CURRENT_CATALOG
1823     | SQL_TOKEN_CURRENT_DEFAULT_TRANSFORM_GROUP
1824     | SQL_TOKEN_CURRENT_PATH
1825     | SQL_TOKEN_CURRENT_ROLE
1826     | SQL_TOKEN_CURRENT_SCHEMA
1827     | SQL_TOKEN_CURRENT_USER
1828     | SQL_TOKEN_SESSION_USER
1829     | SQL_TOKEN_SYSTEM_USER
1830     ;
1831 set_fct_spec:
1832         general_set_fct
1833     |   '{' odbc_fct_spec '}'
1834         {
1835             $$ = SQL_NEW_RULE;
1836             $$->append($1 = newNode("{", SQL_NODE_PUNCTUATION));
1837             $$->append($2);
1838             $$->append($3 = newNode("}", SQL_NODE_PUNCTUATION));
1839         }
1840     |   function_name '(' ')'
1841         {
1842             $$ = SQL_NEW_RULE;
1843             $$->append($1);
1844             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1845             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
1846         }
1847     |   function_name0 '(' ')'
1848         {
1849             $$ = SQL_NEW_RULE;
1850             $$->append($1);
1851             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1852             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
1853         }
1854     |   function_name1 '(' function_arg ')'
1855         {
1856             $$ = SQL_NEW_RULE;
1857             $$->append($1);
1858             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1859             $$->append($3);
1860             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
1861         }
1862     |   function_name2 '(' function_arg_commalist2 ')'
1863         {
1864             $$ = SQL_NEW_RULE;
1865             $$->append($1);
1866             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1867             $$->append($3);
1868             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
1869         }
1870     |   function_name3 '(' function_arg_commalist3 ')'
1871         {
1872             $$ = SQL_NEW_RULE;
1873             $$->append($1);
1874             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1875             $$->append($3);
1876             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
1877         }
1878     |   string_function_4Argument '(' function_arg_commalist4 ')'
1879         {
1880             $$ = SQL_NEW_RULE;
1881             $$->append($1);
1882             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1883             $$->append($3);
1884             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
1885         }
1886     |   function_name '(' function_args_commalist ')'
1887         {
1888             $$ = SQL_NEW_RULE;
1889             $$->append($1);
1890             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1891             $$->append($3);
1892             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
1893         }
1894     |   function_name12 '(' function_args_commalist ')'
1895         {
1896             if ( $3->count() == 1 || $3->count() == 2 )
1897             {
1898                 $$ = SQL_NEW_RULE;
1899                 $$->append($1);
1900                 $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1901                 $$->append($3);
1902                 $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
1903             }
1904             else
1905                 YYERROR;
1906         }
1907     |   function_name23 '(' function_args_commalist ')'
1908         {
1909             if ( $3->count() == 2 || $3->count() == 3)
1910             {
1911                 $$ = SQL_NEW_RULE;
1912                 $$->append($1);
1913                 $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
1914                 $$->append($3);
1915                 $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
1916             }
1917             else
1918                 YYERROR;
1919         }
1920     ;
1921 function_name0:
1922         date_function_0Argument
1923     |   numeric_function_0Argument
1924     ;
1925 function_name1:
1926         string_function_1Argument
1927     |   date_function_1Argument
1928     |   numeric_function_1Argument
1929     ;
1930 function_name2:
1931         string_function_2Argument
1932     |   numeric_function_2Argument
1933     ;
1934 function_name12:
1935         SQL_TOKEN_ROUND
1936     |   SQL_TOKEN_WEEK
1937     |   SQL_TOKEN_LOGF
1938     |   SQL_TOKEN_LOG
1939     ;
1940 function_name23:
1941         SQL_TOKEN_LOCATE
1942     |   SQL_TOKEN_DATEDIFF
1943     ;
1944 function_name3:
1945         string_function_3Argument
1946     ;
1947 function_name:
1948         string_function
1949     |   date_function
1950     |   numeric_function
1951     |   SQL_TOKEN_NAME
1952     ;
1953 string_function_1Argument:
1954         SQL_TOKEN_LENGTH
1955     |   SQL_TOKEN_ASCII
1956     |   SQL_TOKEN_LCASE
1957     |   SQL_TOKEN_LTRIM
1958     |   SQL_TOKEN_RTRIM
1959     |   SQL_TOKEN_SPACE
1960     |   SQL_TOKEN_UCASE
1961     ;
1962 
1963 string_function_2Argument:
1964         SQL_TOKEN_REPEAT
1965     |   SQL_TOKEN_LEFT
1966     |   SQL_TOKEN_RIGHT
1967     ;
1968 string_function_3Argument:
1969         SQL_TOKEN_REPLACE
1970     ;
1971 string_function_4Argument:
1972         SQL_TOKEN_INSERT
1973     ;
1974 
1975 string_function:
1976         SQL_TOKEN_CHAR
1977     |   SQL_TOKEN_CONCAT
1978     |   SQL_TOKEN_DIFFERENCE
1979     |   SQL_TOKEN_LOCATE_2
1980     |   SQL_TOKEN_SOUNDEX
1981     ;
1982 date_function_0Argument:
1983         SQL_TOKEN_CURDATE
1984     |   SQL_TOKEN_CURTIME
1985     |   SQL_TOKEN_NOW
1986     ;
1987 date_function_1Argument:
1988         SQL_TOKEN_DAYOFWEEK
1989     |   SQL_TOKEN_DAYOFMONTH
1990     |   SQL_TOKEN_DAYOFYEAR
1991     |   SQL_TOKEN_MONTH
1992     |   SQL_TOKEN_DAYNAME
1993     |   SQL_TOKEN_MONTHNAME
1994     |   SQL_TOKEN_QUARTER
1995     |   SQL_TOKEN_HOUR
1996     |   SQL_TOKEN_MINUTE
1997     |   SQL_TOKEN_SECOND
1998     |   SQL_TOKEN_YEAR
1999     |   SQL_TOKEN_DAY
2000     |   SQL_TOKEN_TIMEVALUE
2001     |   SQL_TOKEN_DATEVALUE
2002     ;
2003 
2004 date_function:
2005         SQL_TOKEN_TIMESTAMPADD
2006     |   SQL_TOKEN_TIMESTAMPDIFF
2007     ;
2008 numeric_function_0Argument:
2009         SQL_TOKEN_PI
2010     ;
2011 numeric_function_1Argument:
2012         SQL_TOKEN_ABS
2013     |   SQL_TOKEN_ACOS
2014     |   SQL_TOKEN_ASIN
2015     |   SQL_TOKEN_ATAN
2016     |   SQL_TOKEN_CEILING
2017     |   SQL_TOKEN_COS
2018     |   SQL_TOKEN_COT
2019     |   SQL_TOKEN_DEGREES
2020     |   SQL_TOKEN_FLOOR
2021     |   SQL_TOKEN_SIGN
2022     |   SQL_TOKEN_SIN
2023     |   SQL_TOKEN_SQRT
2024     |   SQL_TOKEN_TAN
2025     |   SQL_TOKEN_EXP
2026     |   SQL_TOKEN_LOG10
2027     |   SQL_TOKEN_LN
2028     |   SQL_TOKEN_RADIANS
2029     |   SQL_TOKEN_ROUNDMAGIC
2030     ;
2031 numeric_function_2Argument:
2032         SQL_TOKEN_ATAN2
2033     |   SQL_TOKEN_MOD
2034     |   SQL_TOKEN_POWER
2035     ;
2036 numeric_function:
2037         SQL_TOKEN_RAND
2038     |   SQL_TOKEN_TRUNCATE
2039     ;
2040 
2041 window_function:
2042     window_function_type SQL_TOKEN_OVER window_name_or_specification
2043     {
2044             $$ = SQL_NEW_RULE;
2045             $$->append($1);
2046             $$->append($2);
2047             $$->append($3);
2048     }
2049     ;
2050 window_function_type :
2051         rank_function_type '(' ')'
2052         {
2053             $$ = SQL_NEW_RULE;
2054             $$->append($1);
2055             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2056             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
2057         }
2058     |   SQL_TOKEN_ROW_NUMBER '(' ')'
2059         {
2060             $$ = SQL_NEW_RULE;
2061             $$->append($1);
2062             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2063             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
2064         }
2065     | general_set_fct
2066     | ntile_function
2067     | lead_or_lag_function
2068     | first_or_last_value_function
2069     | nth_value_function
2070 ;
2071 ntile_function :
2072     SQL_TOKEN_NTILE '(' number_of_tiles ')'
2073     {
2074             $$ = SQL_NEW_RULE;
2075             $$->append($1);
2076             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2077             $$->append($3);
2078             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
2079     }
2080     ;
2081 dynamic_parameter_specification:
2082     parameter
2083     ;
2084 simple_value_specification:
2085     literal
2086     ;
2087 number_of_tiles :
2088         simple_value_specification
2089     |   dynamic_parameter_specification
2090     ;
2091 opt_lead_or_lag_function:
2092     /* empty */      {$$ = SQL_NEW_RULE;}
2093     | ',' offset
2094         {
2095             $$ = SQL_NEW_RULE;
2096             $$->append($1 = newNode(",", SQL_NODE_PUNCTUATION));
2097             $$->append($2);
2098         }
2099     | ',' offset ',' default_expression
2100         {
2101             $$ = SQL_NEW_RULE;
2102             $$->append($1 = newNode(",", SQL_NODE_PUNCTUATION));
2103             $$->append($2);
2104             $$->append($3 = newNode(",", SQL_NODE_PUNCTUATION));
2105             $$->append($4);
2106         }
2107     ;
2108 opt_null_treatment:
2109         /* empty */      {$$ = SQL_NEW_RULE;}
2110     |   null_treatment
2111     ;
2112 
2113 lead_or_lag_function:
2114     lead_or_lag '(' lead_or_lag_extent opt_lead_or_lag_function ')' opt_null_treatment
2115     {
2116             $$ = SQL_NEW_RULE;
2117             $$->append($1);
2118             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2119             $$->append($3);
2120             $$->append($4);
2121             $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
2122             $$->append($6);
2123     }
2124     ;
2125 lead_or_lag:
2126         SQL_TOKEN_LEAD
2127     |   SQL_TOKEN_LAG
2128     ;
2129 lead_or_lag_extent:
2130     value_exp
2131     ;
2132 offset:
2133     SQL_TOKEN_INTNUM
2134     ;
2135 default_expression:
2136     value_exp
2137     ;
2138 null_treatment:
2139         SQL_TOKEN_RESPECT SQL_TOKEN_NULLS
2140     |   SQL_TOKEN_IGNORE SQL_TOKEN_NULLS
2141     ;
2142 first_or_last_value_function:
2143     first_or_last_value '(' value_exp ')' opt_null_treatment
2144     {
2145             $$ = SQL_NEW_RULE;
2146             $$->append($1);
2147             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2148             $$->append($3);
2149             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
2150             $$->append($5);
2151     }
2152     ;
2153 first_or_last_value :
2154         SQL_TOKEN_FIRST_VALUE
2155     |   SQL_TOKEN_LAST_VALUE
2156     ;
2157 opt_from_first_or_last:
2158         /* empty */      {$$ = SQL_NEW_RULE;}
2159     |   from_first_or_last
2160     ;
2161 nth_value_function:
2162     SQL_TOKEN_NTH_VALUE '(' value_exp ',' nth_row ')' opt_from_first_or_last opt_null_treatment
2163     {
2164             $$ = SQL_NEW_RULE;
2165             $$->append($1);
2166             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2167             $$->append($3);
2168             $$->append($4 = newNode(",", SQL_NODE_PUNCTUATION));
2169             $$->append($5);
2170             $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
2171             $$->append($7);
2172             $$->append($8);
2173     }
2174     ;
2175 nth_row:
2176         simple_value_specification
2177     |   dynamic_parameter_specification
2178     ;
2179 from_first_or_last:
2180         SQL_TOKEN_FROM SQL_TOKEN_FIRST
2181         {
2182             $$ = SQL_NEW_RULE;
2183             $$->append($1);
2184             $$->append($2);
2185         }
2186     |   SQL_TOKEN_FROM SQL_TOKEN_LAST
2187         {
2188             $$ = SQL_NEW_RULE;
2189             $$->append($1);
2190             $$->append($2);
2191         }
2192     ;
2193 window_name:
2194     SQL_TOKEN_NAME
2195     ;
2196 window_name_or_specification:
2197         window_name
2198     |   in_line_window_specification
2199     ;
2200 in_line_window_specification:
2201     window_specification
2202     ;
2203 opt_window_clause:
2204         /* empty */      {$$ = SQL_NEW_RULE;}
2205     |   window_clause
2206     ;
2207 window_clause:
2208     SQL_TOKEN_WINDOW window_definition_list
2209     {
2210         $$ = SQL_NEW_RULE;
2211         $$->append($1);
2212         $$->append($2);
2213     }
2214     ;
2215 window_definition_list:
2216         window_definition_list ',' window_definition
2217             {$1->append($3);
2218             $$ = $1;}
2219     |   window_definition
2220             {$$ = SQL_NEW_COMMALISTRULE;
2221             $$->append($1);}
2222     ;
2223 window_definition:
2224     new_window_name SQL_TOKEN_AS window_specification
2225     {
2226         $$ = SQL_NEW_RULE;
2227         $$->append($1);
2228         $$->append($2);
2229         $$->append($3);
2230     }
2231     ;
2232 new_window_name:
2233     window_name
2234     ;
2235 window_specification:
2236     '(' window_specification_details ')'
2237     {
2238         $$ = SQL_NEW_RULE;
2239         $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
2240         $$->append($2);
2241         $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
2242     }
2243     ;
2244 opt_existing_window_name:
2245         /* empty */      {$$ = SQL_NEW_RULE;}
2246     |   existing_window_name
2247     ;
2248 opt_window_partition_clause:
2249     /* empty */      {$$ = SQL_NEW_RULE;}
2250     |   window_partition_clause
2251     ;
2252 opt_window_frame_clause:
2253     /* empty */      {$$ = SQL_NEW_RULE;}
2254     |   window_frame_clause
2255     ;
2256 window_specification_details:
2257     opt_existing_window_name
2258     opt_window_partition_clause
2259     opt_order_by_clause
2260     opt_window_frame_clause
2261     ;
2262 existing_window_name:
2263     window_name
2264     ;
2265 window_partition_clause:
2266     SQL_TOKEN_PARTITION SQL_TOKEN_BY window_partition_column_reference_list
2267     {
2268         $$ = SQL_NEW_RULE;
2269         $$->append($1);
2270         $$->append($2);
2271         $$->append($3);
2272     }
2273     ;
2274 window_partition_column_reference_list:
2275     window_partition_column_reference_list ',' window_partition_column_reference
2276             {$1->append($3);
2277             $$ = $1;}
2278     |   window_partition_column_reference
2279             {$$ = SQL_NEW_COMMALISTRULE;
2280             $$->append($1);}
2281     ;
2282 window_partition_column_reference:
2283     column_ref opt_collate_clause
2284     {
2285         $$ = SQL_NEW_RULE;
2286         $$->append($1);
2287         $$->append($2);
2288     }
2289     ;
2290 opt_window_frame_exclusion:
2291     /* empty */      {$$ = SQL_NEW_RULE;}
2292     |   window_frame_exclusion
2293     ;
2294 window_frame_clause:
2295     window_frame_units window_frame_extent opt_window_frame_exclusion
2296     {
2297         $$ = SQL_NEW_RULE;
2298         $$->append($1);
2299         $$->append($2);
2300         $$->append($3);
2301     }
2302     ;
2303 window_frame_units:
2304         SQL_TOKEN_ROWS
2305     |   SQL_TOKEN_RANGE
2306     ;
2307 window_frame_extent:
2308         window_frame_start
2309     |   window_frame_between
2310     ;
2311 window_frame_start:
2312         SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING
2313         {
2314             $$ = SQL_NEW_RULE;
2315             $$->append($1);
2316             $$->append($2);
2317         }
2318     |   window_frame_preceding
2319     |   SQL_TOKEN_CURRENT SQL_TOKEN_ROW
2320         {
2321             $$ = SQL_NEW_RULE;
2322             $$->append($1);
2323             $$->append($2);
2324         }
2325     ;
2326 window_frame_preceding:
2327     unsigned_value_spec SQL_TOKEN_PRECEDING
2328     {
2329         $$ = SQL_NEW_RULE;
2330         $$->append($1);
2331         $$->append($2);
2332     }
2333     ;
2334 window_frame_between:
2335     SQL_TOKEN_BETWEEN window_frame_bound_1 SQL_TOKEN_AND window_frame_bound_2
2336     {
2337         $$ = SQL_NEW_RULE;
2338         $$->append($1);
2339         $$->append($2);
2340         $$->append($3);
2341         $$->append($4);
2342     }
2343     ;
2344 window_frame_bound_1:
2345     window_frame_bound
2346     ;
2347 window_frame_bound_2:
2348     window_frame_bound
2349     ;
2350 window_frame_bound:
2351     window_frame_start
2352     | SQL_TOKEN_UNBOUNDED SQL_TOKEN_FOLLOWING
2353     {
2354         $$ = SQL_NEW_RULE;
2355         $$->append($1);
2356         $$->append($2);
2357     }
2358     | window_frame_following
2359     ;
2360 window_frame_following:
2361     unsigned_value_spec SQL_TOKEN_FOLLOWING
2362     {
2363         $$ = SQL_NEW_RULE;
2364         $$->append($1);
2365         $$->append($2);
2366     }
2367     ;
2368 window_frame_exclusion:
2369         SQL_TOKEN_EXCLUDE SQL_TOKEN_CURRENT SQL_TOKEN_ROW
2370         {
2371             $$ = SQL_NEW_RULE;
2372             $$->append($1);
2373             $$->append($2);
2374             $$->append($3);
2375         }
2376     |   SQL_TOKEN_EXCLUDE SQL_TOKEN_GROUP
2377         {
2378             $$ = SQL_NEW_RULE;
2379             $$->append($1);
2380             $$->append($2);
2381         }
2382     |   SQL_TOKEN_EXCLUDE SQL_TOKEN_TIES
2383         {
2384             $$ = SQL_NEW_RULE;
2385             $$->append($1);
2386             $$->append($2);
2387         }
2388     |   SQL_TOKEN_EXCLUDE SQL_TOKEN_NO SQL_TOKEN_OTHERS
2389         {
2390             $$ = SQL_NEW_RULE;
2391             $$->append($1);
2392             $$->append($2);
2393             $$->append($3);
2394         }
2395     ;
2396 op_parameter:
2397         {$$ = SQL_NEW_RULE;}
2398     |   '?' SQL_EQUAL
2399         {
2400             $$ = SQL_NEW_RULE;
2401             $$->append($1 = newNode("?", SQL_NODE_PUNCTUATION));
2402             $$->append($2);
2403         }
2404     ;
2405 odbc_call_spec:
2406         op_parameter SQL_TOKEN_CALL table_node op_odbc_call_parameter
2407         {
2408             $$ = SQL_NEW_RULE;
2409             $$->append($1);
2410             $$->append($2);
2411             $$->append($3);
2412             $$->append($4);
2413         }
2414     ;
2415 
2416 op_odbc_call_parameter:
2417         {$$ = SQL_NEW_RULE;}
2418     |   '(' odbc_parameter_commalist ')'
2419         {
2420             $$ = SQL_NEW_RULE;
2421             $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
2422             $$->append($2);
2423             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
2424         }
2425     ;
2426 
2427 odbc_parameter_commalist:
2428         odbc_parameter
2429         {$$ = SQL_NEW_COMMALISTRULE;
2430             $$->append($1);}
2431     |   odbc_parameter_commalist ',' odbc_parameter
2432         {
2433             $1->append($3);
2434             $$ = $1;
2435         }
2436     ;
2437 odbc_parameter:
2438     /* empty */     {$$ = SQL_NEW_RULE;}
2439     |   literal
2440     |   parameter
2441     ;
2442 
2443 odbc_fct_spec:
2444         odbc_fct_type SQL_TOKEN_STRING
2445         {
2446             $$ = SQL_NEW_RULE;
2447             $$->append($1);
2448             $$->append($2);
2449         }
2450     |   SQL_TOKEN_FN set_fct_spec
2451         {
2452             $$ = SQL_NEW_RULE;
2453             $$->append($1);
2454             $$->append($2);
2455         }
2456     ;
2457 
2458 odbc_fct_type:
2459         SQL_TOKEN_D
2460     |   SQL_TOKEN_T
2461     |   SQL_TOKEN_TS
2462     ;
2463 
2464 general_set_fct:
2465         set_fct_type '(' opt_all_distinct function_arg ')'
2466         {
2467             $$ = SQL_NEW_RULE;
2468             $$->append($1);
2469             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2470             $$->append($3);
2471             $$->append($4);
2472             $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
2473         }
2474     |   SQL_TOKEN_COUNT '(' '*' ')'
2475         {
2476             $$ = SQL_NEW_RULE;
2477             $$->append($1);
2478             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2479             $$->append($3 = newNode("*", SQL_NODE_PUNCTUATION));
2480             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
2481         }
2482     |   SQL_TOKEN_COUNT '(' opt_all_distinct function_arg ')'
2483         {
2484             $$ = SQL_NEW_RULE;
2485             $$->append($1);
2486             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2487             $$->append($3);
2488             $$->append($4);
2489             $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
2490         }
2491     |   ordered_set_function
2492     |   array_aggregate_function
2493     ;
2494 set_fct_type:
2495         SQL_TOKEN_AVG
2496     |   SQL_TOKEN_MAX
2497     |   SQL_TOKEN_MIN
2498     |   SQL_TOKEN_SUM
2499     |   SQL_TOKEN_EVERY
2500     |   SQL_TOKEN_ANY
2501     |   SQL_TOKEN_SOME
2502     |   SQL_TOKEN_STDDEV_POP
2503     |   SQL_TOKEN_STDDEV_SAMP
2504     |   SQL_TOKEN_VAR_SAMP
2505     |   SQL_TOKEN_VAR_POP
2506     |   SQL_TOKEN_COLLECT
2507     |   SQL_TOKEN_FUSION
2508     |   SQL_TOKEN_INTERSECTION
2509     ;
2510 
2511 ordered_set_function:
2512         hypothetical_set_function
2513     |   inverse_distribution_function
2514     ;
2515 hypothetical_set_function:
2516         rank_function_type '('  hypothetical_set_function_value_expression_list ')' within_group_specification
2517         {
2518             $$ = SQL_NEW_RULE;
2519             $$->append($1);
2520             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2521             $$->append($3);
2522             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
2523             $$->append($5);
2524         }
2525     |   rank_function_type '('  hypothetical_set_function_value_expression_list SQL_TOKEN_BY value_exp_commalist ')'    within_group_specification
2526     {
2527         $$ = SQL_NEW_RULE;
2528         $$->append($1);
2529         $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2530         $$->append($3);
2531         $$->append($4);
2532         $$->append($5);
2533         $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
2534         $$->append($7);
2535     }
2536     ;
2537 
2538 within_group_specification:
2539     {
2540         $$ = SQL_NEW_RULE;
2541     }
2542     |   SQL_TOKEN_WITHIN SQL_TOKEN_GROUP '(' opt_order_by_clause ')'
2543     {
2544         $$ = SQL_NEW_RULE;
2545         $$->append($1);
2546         $$->append($2);
2547         $$->append($3 = newNode("(", SQL_NODE_PUNCTUATION));
2548         $$->append($4);
2549         $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
2550     }
2551     ;
2552 hypothetical_set_function_value_expression_list:
2553     value_exp_commalist
2554     ;
2555 
2556 inverse_distribution_function:
2557     inverse_distribution_function_type '('inverse_distribution_function_argument ')' within_group_specification
2558     {
2559         $$ = SQL_NEW_RULE;
2560         $$->append($1);
2561         $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2562         $$->append($3);
2563         $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
2564     }
2565     ;
2566 inverse_distribution_function_argument:
2567         num_value_exp
2568     ;
2569 inverse_distribution_function_type:
2570         SQL_TOKEN_PERCENTILE_CONT
2571     |   SQL_TOKEN_PERCENTILE_DISC
2572     ;
2573 
2574 array_aggregate_function:
2575     SQL_TOKEN_ARRAY_AGG '(' value_exp opt_order_by_clause ')'
2576     {
2577         $$ = SQL_NEW_RULE;
2578         $$->append($1);
2579         $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2580         $$->append($3);
2581         $$->append($4);
2582         $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
2583     }
2584     ;
2585 
2586 rank_function_type:
2587         SQL_TOKEN_RANK
2588     |   SQL_TOKEN_DENSE_RANK
2589     |   SQL_TOKEN_PERCENT_RANK
2590     |   SQL_TOKEN_CUME_DIST
2591     ;
2592 outer_join_type:
2593         SQL_TOKEN_LEFT %prec SQL_TOKEN_LEFT
2594         {
2595             $$ = SQL_NEW_RULE;
2596             $$->append($1);
2597         }
2598       | SQL_TOKEN_RIGHT %prec SQL_TOKEN_RIGHT
2599         {
2600             $$ = SQL_NEW_RULE;
2601             $$->append($1);
2602         }
2603       | SQL_TOKEN_FULL %prec SQL_TOKEN_FULL
2604         {
2605             $$ = SQL_NEW_RULE;
2606             $$->append($1);
2607         }
2608       ;
2609 join_condition:
2610         SQL_TOKEN_ON search_condition
2611         {
2612             $$ = SQL_NEW_RULE;
2613             $$->append($1);
2614             $$->append($2);
2615         }
2616         ;
2617 join_spec:
2618         join_condition
2619       | named_columns_join
2620       ;
2621 join_type:
2622         /* empty */     {$$ = SQL_NEW_RULE;}
2623       | SQL_TOKEN_INNER
2624         {
2625             $$ = SQL_NEW_RULE;
2626             $$->append($1);
2627         }
2628       | outer_join_type
2629       | outer_join_type SQL_TOKEN_OUTER
2630         {
2631             $$ = SQL_NEW_RULE;
2632             $$->append($1);
2633             $$->append($2);
2634         }
2635     ;
2636 cross_union:
2637         table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref
2638         {
2639             $$ = SQL_NEW_RULE;
2640             $$->append($1);
2641             $$->append($2);
2642             $$->append($3);
2643             $$->append($4);
2644         }
2645     ;
2646 
2647 qualified_join:
2648         /* wenn SQL_TOKEN_NATURAL, dann keine join_spec */
2649         table_ref SQL_TOKEN_NATURAL join_type SQL_TOKEN_JOIN table_ref
2650         {
2651             $$ = SQL_NEW_RULE;
2652             $$->append($1);
2653             $$->append($2);
2654             $$->append($3);
2655             $$->append($4);
2656             $$->append($5);
2657         }
2658     |   table_ref join_type SQL_TOKEN_JOIN table_ref join_spec
2659         {
2660             $$ = SQL_NEW_RULE;
2661             $$->append($1);
2662             $$->append($2);
2663             $$->append($3);
2664             $$->append($4);
2665             $$->append($5);
2666         }
2667     |   cross_union
2668     ;
2669 joined_table:
2670         qualified_join
2671     ;
2672 named_columns_join:
2673         SQL_TOKEN_USING '(' column_commalist ')'
2674         {
2675             $$ = SQL_NEW_RULE;
2676             $$->append($1);
2677             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2678             $$->append($3);
2679             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
2680         }
2681     ;
2682 simple_table:
2683         select_statement
2684       | values_or_query_spec
2685       ;
2686 
2687 non_join_query_primary:
2688         simple_table
2689       | '(' non_join_query_exp ')'
2690         {
2691             $$ = SQL_NEW_RULE;
2692             $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
2693             $$->append($2);
2694             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
2695         }
2696       ;
2697 non_join_query_term:
2698         non_join_query_primary
2699     |   query_term SQL_TOKEN_INTERSECT all query_primary
2700         {
2701             $$ = SQL_NEW_RULE;
2702             $$->append($1);
2703             $$->append($2);
2704             $$->append($3);
2705             $$->append($4);
2706         }
2707     ;
2708 query_primary:
2709         non_join_query_primary
2710     ;
2711 non_join_query_exp:
2712         non_join_query_term
2713       | query_exp SQL_TOKEN_UNION all query_term
2714         {
2715             $$ = SQL_NEW_RULE;
2716             $$->append($1);
2717             $$->append($2);
2718             $$->append($3);
2719             $$->append($4);
2720         }
2721       | query_exp SQL_TOKEN_EXCEPT all query_term
2722         {
2723             $$ = SQL_NEW_RULE;
2724             $$->append($1);
2725             $$->append($2);
2726             $$->append($3);
2727             $$->append($4);
2728         }
2729     ;
2730 all:
2731     /* empty*/ {$$ = SQL_NEW_RULE;}
2732     |   SQL_TOKEN_ALL
2733     ;
2734 query_exp:
2735         non_join_query_exp /*[^')']*/
2736     ;
2737 scalar_subquery:
2738         subquery
2739     ;
2740 cast_operand:
2741         value_exp
2742     ;
2743 cast_target:
2744         table_node
2745       | data_type
2746     ;
2747 cast_spec:
2748       SQL_TOKEN_CAST '(' cast_operand SQL_TOKEN_AS cast_target ')'
2749       {
2750             $$ = SQL_NEW_RULE;
2751             $$->append($1);
2752             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
2753             $$->append($3);
2754             $$->append($4);
2755             $$->append($5);
2756             $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
2757         }
2758     ;
2759 value_exp_primary:
2760         unsigned_value_spec
2761       | column_ref
2762       | set_fct_spec
2763       | scalar_subquery
2764       | case_expression
2765       | window_function
2766       | '(' value_exp ')'
2767         {
2768             $$ = SQL_NEW_RULE;
2769             $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
2770             $$->append($2);
2771             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
2772         }
2773       | cast_spec
2774     ;
2775 
2776 num_primary:
2777         value_exp_primary
2778       | num_value_fct
2779     ;
2780 factor:
2781         num_primary
2782     |   '-' num_primary  %prec SQL_TOKEN_UMINUS
2783         {
2784             $$ = SQL_NEW_RULE;
2785             $$->append($1 = newNode("-", SQL_NODE_PUNCTUATION));
2786             $$->append($2);
2787         }
2788     |   '+' num_primary  %prec SQL_TOKEN_UMINUS
2789         {
2790             $$ = SQL_NEW_RULE;
2791             $$->append($1 = newNode("+", SQL_NODE_PUNCTUATION));
2792             $$->append($2);
2793         }
2794     ;
2795 
2796 term:
2797         factor
2798       | term '*' factor
2799         {
2800             $$ = SQL_NEW_RULE;
2801             $$->append($1);
2802             $$->append($2 = newNode("*", SQL_NODE_PUNCTUATION));
2803             $$->append($3);
2804         }
2805       | term '/' factor
2806         {
2807             $$ = SQL_NEW_RULE;
2808             $$->append($1);
2809             $$->append($2 = newNode("/", SQL_NODE_PUNCTUATION));
2810             $$->append($3);
2811         }
2812       ;
2813 
2814 num_value_exp:
2815         term
2816       | num_value_exp '+' term
2817         {
2818             $$ = SQL_NEW_RULE;
2819             $$->append($1);
2820             $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
2821             $$->append($3);
2822         }
2823       | num_value_exp '-' term
2824         {
2825             $$ = SQL_NEW_RULE;
2826             $$->append($1);
2827             $$->append($2 = newNode("-", SQL_NODE_PUNCTUATION));
2828             $$->append($3);
2829         }
2830       ;
2831 datetime_primary:
2832 /*      value_exp_primary
2833         {
2834             $$ = SQL_NEW_RULE;
2835             $$->append($1);
2836         }
2837       |*/ datetime_value_fct
2838         {
2839             $$ = SQL_NEW_RULE;
2840             $$->append($1);
2841         }
2842     ;
2843 datetime_value_fct:
2844         SQL_TOKEN_CURRENT_DATE
2845         {
2846             $$ = SQL_NEW_RULE;
2847             $$->append($1);
2848         }
2849       | SQL_TOKEN_CURRENT_TIME
2850         {
2851             $$ = SQL_NEW_RULE;
2852             $$->append($1);
2853         }
2854       | SQL_TOKEN_CURRENT_TIMESTAMP
2855         {
2856             $$ = SQL_NEW_RULE;
2857             $$->append($1);
2858         }
2859     ;
2860 time_zone:
2861         SQL_TOKEN_AT time_zone_specifier
2862         {
2863             $$ = SQL_NEW_RULE;
2864             $$->append($1);
2865             $$->append($2);
2866         }
2867     ;
2868 time_zone_specifier:
2869         SQL_TOKEN_LOCAL
2870         {
2871             $$ = SQL_NEW_RULE;
2872             $$->append($1);
2873         }
2874 /*      | SQL_TOKEN_TIME SQL_TOKEN_ZONE interval_value_exp
2875         {
2876             $$ = SQL_NEW_RULE;
2877             $$->append($1);
2878             $$->append($2);
2879             $$->append($3);
2880         }*/
2881       ;
2882 datetime_factor:
2883         datetime_primary
2884         {
2885             $$ = SQL_NEW_RULE;
2886             $$->append($1);
2887         }
2888     |   datetime_primary time_zone
2889         {
2890             $$ = SQL_NEW_RULE;
2891             $$->append($1);
2892             $$->append($2);
2893         }
2894     ;
2895 datetime_term:
2896         datetime_factor
2897         {
2898             $$ = SQL_NEW_RULE;
2899             $$->append($1);
2900         }
2901     ;
2902 /*
2903 interval_term:
2904         literal
2905       | interval_term '*' factor
2906         {
2907             $$ = SQL_NEW_RULE;
2908             $$->append($1);
2909             $$->append($2 = newNode("*", SQL_NODE_PUNCTUATION));
2910             $$->append($3);
2911         }
2912       | interval_term '/' factor
2913         {
2914             $$ = SQL_NEW_RULE;
2915             $$->append($1);
2916             $$->append($2 = newNode("/", SQL_NODE_PUNCTUATION));
2917             $$->append($3);
2918         }
2919     ;
2920 */
2921 datetime_value_exp:
2922         datetime_term
2923         {
2924             $$ = SQL_NEW_RULE;
2925             $$->append($1);
2926         }
2927 /*      | interval_value_exp '+' datetime_term
2928         {
2929             $$ = SQL_NEW_RULE;
2930             $$->append($1);
2931             $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
2932             $$->append($3);
2933         }
2934       | datetime_value_exp '+' interval_term
2935         {
2936             $$ = SQL_NEW_RULE;
2937             $$->append($1);
2938             $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
2939             $$->append($3);
2940         }
2941       | datetime_value_exp '-' interval_term
2942         {
2943             $$ = SQL_NEW_RULE;
2944             $$->append($1);
2945             $$->append($2 = newNode("-", SQL_NODE_PUNCTUATION));
2946             $$->append($3);
2947         }
2948 */  ;
2949 /*
2950 interval_value_exp:
2951         interval_term
2952         {
2953             $$ = SQL_NEW_RULE;
2954             $$->append($1);
2955         }
2956       | interval_value_exp '+' interval_term
2957         {
2958             $$ = SQL_NEW_RULE;
2959             $$->append($1);
2960             $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
2961             $$->append($3);
2962         }
2963       | interval_value_exp '-' interval_term
2964         {
2965             $$ = SQL_NEW_RULE;
2966             $$->append($1);
2967             $$->append($2 = newNode("-", SQL_NODE_PUNCTUATION));
2968             $$->append($3);
2969         }
2970       | '(' datetime_value_exp '-' datetime_term ')' interval_qualifier
2971         {
2972             $$ = SQL_NEW_RULE;
2973             $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
2974             $$->append($2);
2975             $$->append($3 = newNode("-", SQL_NODE_PUNCTUATION));
2976             $$->append($4);
2977             $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
2978             $$->append($6);
2979         }
2980     ;
2981 */
2982 non_second_datetime_field:
2983         SQL_TOKEN_YEAR
2984     |   SQL_TOKEN_MONTH
2985     |   SQL_TOKEN_DAY
2986     |   SQL_TOKEN_HOUR
2987     |   SQL_TOKEN_MINUTE
2988     ;
2989 start_field:
2990         non_second_datetime_field opt_paren_precision
2991         {
2992             $$ = SQL_NEW_RULE;
2993             $$->append($1);
2994             $$->append($2);
2995         }
2996     ;
2997 end_field:
2998         non_second_datetime_field
2999     |   SQL_TOKEN_SECOND opt_paren_precision
3000         {
3001             $$ = SQL_NEW_RULE;
3002             $$->append($1);
3003             $$->append($2);
3004         }
3005     ;
3006 
3007 single_datetime_field:
3008         non_second_datetime_field opt_paren_precision
3009         {
3010             $$ = SQL_NEW_RULE;
3011             $$->append($1);
3012             $$->append($2);
3013         }
3014     |   SQL_TOKEN_SECOND opt_paren_precision_scale
3015         {
3016             $$ = SQL_NEW_RULE;
3017             $$->append($1);
3018             $$->append($2);
3019         }
3020     ;
3021 
3022 interval_qualifier:
3023         start_field SQL_TOKEN_TO end_field
3024         {
3025             $$ = SQL_NEW_RULE;
3026             $$->append($1);
3027             $$->append($2);
3028             $$->append($3);
3029         }
3030     |   single_datetime_field
3031     ;
3032 
3033 function_arg_commalist2:
3034         function_arg ',' function_arg
3035             {$$ = SQL_NEW_COMMALISTRULE;
3036             $$->append($1);
3037             $$->append($3);}
3038     ;
3039 function_arg_commalist3:
3040         function_arg ',' function_arg ',' function_arg
3041         {
3042             $$ = SQL_NEW_COMMALISTRULE;
3043             $$->append($1);
3044             $$->append($3);
3045             $$->append($5);
3046         }
3047     ;
3048 function_arg_commalist4:
3049         function_arg ',' function_arg ',' function_arg ',' function_arg
3050         {
3051             $$ = SQL_NEW_COMMALISTRULE;
3052             $$->append($1);
3053             $$->append($3);
3054             $$->append($5);
3055             $$->append($7);
3056         }
3057     ;
3058 value_exp_commalist:
3059         value_exp
3060             {$$ = SQL_NEW_COMMALISTRULE;
3061             $$->append($1);}
3062     |   value_exp_commalist ',' value_exp
3063             {$1->append($3);
3064             $$ = $1;}
3065     /*  this rule is only valid if we check predicates */
3066     |   value_exp_commalist ';' value_exp
3067         {
3068             if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
3069             {
3070                 $1->append($3);
3071                 $$ = $1;
3072             }
3073             else
3074                 YYERROR;
3075         }
3076     ;
3077 function_arg:
3078         result
3079     |   value_exp comparison value_exp
3080         {
3081             $$ = SQL_NEW_RULE;
3082             $$->append($1);
3083             $$->append($2);
3084             $$->append($3);
3085         }
3086     |   value_exp SQL_TOKEN_USING value_exp comparison value_exp
3087         {
3088             $$ = SQL_NEW_RULE;
3089             $$->append($1);
3090             $$->append($2);
3091             $$->append($3);
3092             $$->append($4);
3093         }
3094     |   value_exp SQL_TOKEN_BY value_exp_commalist
3095         {
3096             $$ = SQL_NEW_RULE;
3097             $$->append($1);
3098             $$->append($2);
3099             $$->append($3);
3100         }
3101     ;
3102 function_args_commalist:
3103         function_arg
3104             {$$ = SQL_NEW_COMMALISTRULE;
3105             $$->append($1);}
3106     |   function_args_commalist ',' function_arg
3107             {$1->append($3);
3108             $$ = $1;}
3109     /*  this rule is only valid if we check predicates */
3110     |   function_args_commalist ';' function_arg
3111         {
3112             if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
3113             {
3114                 $1->append($3);
3115                 $$ = $1;
3116             }
3117             else
3118                 YYERROR;
3119         }
3120     ;
3121 
3122 value_exp:
3123         num_value_exp /*[^')']*/
3124       | string_value_exp
3125       | datetime_value_exp
3126         {
3127             $$ = SQL_NEW_RULE;
3128             $$->append($1);
3129         }
3130     ;
3131 string_value_exp:
3132         char_value_exp
3133 /*      | bit_value_exp
3134         {
3135             $$ = SQL_NEW_RULE;
3136             $$->append($1);
3137         }
3138 */  ;
3139 char_value_exp:
3140         char_factor
3141     |   concatenation
3142     ;
3143 concatenation:
3144         char_value_exp '+' char_factor
3145         {
3146             $$ = SQL_NEW_RULE;
3147             $$->append($1);
3148             $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
3149             $$->append($3);
3150         }
3151     |   value_exp SQL_CONCAT value_exp
3152         {
3153             $$ = SQL_NEW_RULE;
3154             $$->append($1);
3155             $$->append($2);
3156             $$->append($3);
3157         }
3158     ;
3159 
3160 char_primary:
3161             SQL_TOKEN_STRING
3162       |     string_value_fct
3163     ;
3164 collate_clause:
3165         SQL_TOKEN_COLLATE table_node
3166         {
3167             $$ = SQL_NEW_RULE;
3168             $$->append($1);
3169             $$->append($2);
3170         }
3171     ;
3172 char_factor:
3173         char_primary
3174     |   char_primary collate_clause
3175         {
3176             $$ = SQL_NEW_RULE;
3177             $$->append($1);
3178             $$->append($2);
3179         }
3180     ;
3181 string_value_fct:
3182         char_value_fct
3183       | bit_value_fct
3184     ;
3185 bit_value_fct:
3186         bit_substring_fct
3187         {
3188             $$ = SQL_NEW_RULE;
3189             $$->append($1);
3190         }
3191     ;
3192 bit_substring_fct:
3193         SQL_TOKEN_SUBSTRING '(' bit_value_exp SQL_TOKEN_FROM string_value_exp for_length ')'
3194         {
3195             $$ = SQL_NEW_RULE;
3196             $$->append($1);
3197             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
3198             $$->append($3);
3199             $$->append($4);
3200             $$->append($5);
3201             $$->append($6);
3202             $$->append($7 = newNode(")", SQL_NODE_PUNCTUATION));
3203         }
3204     ;
3205 bit_value_exp:
3206         bit_factor
3207         {
3208             $$ = SQL_NEW_RULE;
3209             $$->append($1);
3210         }
3211     ;
3212 /*
3213             bit_concatenation
3214         {
3215             $$ = SQL_NEW_RULE;
3216             $$->append($1);
3217         }
3218       |
3219 bit_concatenation:
3220         bit_value_exp '+' bit_factor
3221         {
3222             $$ = SQL_NEW_RULE;
3223             $$->append($1);
3224             $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
3225             $$->append($3);
3226         }
3227     ;
3228 */
3229 bit_factor:
3230         bit_primary
3231         {
3232             $$ = SQL_NEW_RULE;
3233             $$->append($1);
3234         }
3235     ;
3236 bit_primary:
3237     {$$ = SQL_NEW_RULE;}
3238 /*      value_exp_primary
3239         {
3240             $$ = SQL_NEW_RULE;
3241             $$->append($1);
3242         }
3243       | string_value_fct
3244         {
3245             $$ = SQL_NEW_RULE;
3246             $$->append($1);
3247         }*/
3248     ;
3249 char_value_fct:
3250         char_substring_fct
3251       | fold
3252       | form_conversion
3253         {
3254             $$ = SQL_NEW_RULE;
3255             $$->append($1);
3256         }
3257       | char_translation
3258         {
3259             $$ = SQL_NEW_RULE;
3260             $$->append($1);
3261         }
3262       | trim_fct
3263         {
3264             $$ = SQL_NEW_RULE;
3265             $$->append($1);
3266         }
3267     ;
3268 for_length:
3269         {$$ = SQL_NEW_RULE;}
3270     |   SQL_TOKEN_FOR value_exp
3271         {
3272             $$ = SQL_NEW_RULE;
3273             $$->append($1);
3274             $$->append($2);
3275         }
3276     ;
3277 char_substring_fct:
3278         SQL_TOKEN_SUBSTRING '(' value_exp SQL_TOKEN_FROM value_exp for_length ')'
3279         {
3280             $$ = SQL_NEW_RULE;
3281             $$->append($1);
3282             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
3283             $$->append($3);
3284             $$->append($4);
3285             $$->append($5);
3286             $$->append($6);
3287             $$->append($7 = newNode(")", SQL_NODE_PUNCTUATION));
3288         }
3289     |   SQL_TOKEN_SUBSTRING '(' value_exp_commalist ')'
3290         {
3291             $$ = SQL_NEW_RULE;
3292             $$->append($1);
3293             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
3294             $$->append($3);
3295             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
3296         }
3297     ;
3298 upper_lower:
3299         SQL_TOKEN_UPPER
3300     |   SQL_TOKEN_LOWER
3301     ;
3302 fold:
3303         upper_lower '(' value_exp ')'
3304         {
3305             $$ = SQL_NEW_RULE;
3306             $$->append($1);
3307             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
3308             $$->append($3);
3309             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
3310         }
3311     ;
3312 form_conversion:
3313         SQL_TOKEN_CONVERT '(' string_value_exp SQL_TOKEN_USING table_node ')'
3314         {
3315             $$ = SQL_NEW_RULE;
3316             $$->append($1);
3317             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
3318             $$->append($3);
3319             $$->append($4);
3320             $$->append($5);
3321             $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
3322         }
3323     |   SQL_TOKEN_CONVERT '(' cast_operand ',' cast_target ')'
3324         {
3325             $$ = SQL_NEW_RULE;
3326             $$->append($1);
3327             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
3328             $$->append($3);
3329             $$->append($2 = newNode(",", SQL_NODE_PUNCTUATION));
3330             $$->append($5);
3331             $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
3332         }
3333     ;
3334 char_translation:
3335         SQL_TOKEN_TRANSLATE '(' string_value_exp SQL_TOKEN_USING table_node ')'
3336         {
3337             $$ = SQL_NEW_RULE;
3338             $$->append($1);
3339             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
3340             $$->append($3);
3341             $$->append($4);
3342             $$->append($5);
3343             $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
3344         }
3345     ;
3346 trim_fct:
3347         SQL_TOKEN_TRIM  '(' trim_operands ')'
3348         {
3349             $$ = SQL_NEW_RULE;
3350             $$->append($1);
3351             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
3352             $$->append($3);
3353             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
3354         }
3355     ;
3356 trim_operands:
3357     trim_spec value_exp SQL_TOKEN_FROM value_exp
3358         {
3359             $$ = SQL_NEW_RULE;
3360             $$->append($1);
3361             $$->append($2);
3362             $$->append($3);
3363             $$->append($4);
3364         }
3365     | trim_spec SQL_TOKEN_FROM value_exp
3366         {
3367             $$ = SQL_NEW_RULE;
3368             $$->append($1);
3369             $$->append($2);
3370             $$->append($3);
3371         }
3372     | value_exp SQL_TOKEN_FROM value_exp
3373         {
3374             $$ = SQL_NEW_RULE;
3375             $$->append($1);
3376             $$->append($2);
3377             $$->append($3);
3378         }
3379     | SQL_TOKEN_FROM value_exp
3380         {
3381             $$ = SQL_NEW_RULE;
3382             $$->append($1);
3383             $$->append($2);
3384         }
3385     | value_exp
3386     ;
3387 
3388 trim_spec:
3389         SQL_TOKEN_BOTH
3390     |   SQL_TOKEN_LEADING
3391     |   SQL_TOKEN_TRAILING
3392     ;
3393 
3394 derived_column:
3395         value_exp as_clause
3396         {
3397             $$ = SQL_NEW_RULE;
3398             $$->append($1);
3399             $$->append($2);
3400         }
3401     ;
3402 /* Tabellenname */
3403 table_node:
3404         table_name
3405     |   schema_name
3406     |   catalog_name
3407 ;
3408 catalog_name:
3409         SQL_TOKEN_NAME '.' schema_name
3410         {
3411             $$ = SQL_NEW_RULE;
3412             $$->append($1);
3413             $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
3414             $$->append($3);
3415         }
3416     |   SQL_TOKEN_NAME ':' schema_name
3417         {
3418             $$ = SQL_NEW_RULE;
3419             $$->append($1);
3420             $$->append($2 = newNode(":", SQL_NODE_PUNCTUATION));
3421             $$->append($3);
3422         }
3423 ;
3424 schema_name:
3425         SQL_TOKEN_NAME '.' table_name
3426         {
3427             $$ = SQL_NEW_RULE;
3428             $$->append($1);
3429             $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
3430             $$->append($3);
3431         }
3432 ;
3433 
3434 table_name:
3435             SQL_TOKEN_NAME
3436             {$$ = SQL_NEW_RULE;
3437             $$->append($1);}
3438 ;
3439 /* Columns */
3440 column_ref:
3441             column
3442             {$$ = SQL_NEW_RULE;
3443             $$->append($1);}
3444 /*  |       table_node '.' column_val %prec '.'
3445             {$$ = SQL_NEW_RULE;
3446             $$->append($1);
3447             $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
3448             $$->append($3);}
3449 */
3450     |       SQL_TOKEN_NAME '.' column_val %prec '.'
3451             {$$ = SQL_NEW_RULE;
3452             $$->append($1);
3453             $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
3454             $$->append($3);
3455             }
3456     |       SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val %prec '.'
3457             {$$ = SQL_NEW_RULE;
3458             $$->append($1);
3459             $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
3460             $$->append($3);
3461             $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION));
3462             $$->append($5);}
3463     |       SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val %prec '.'
3464             {$$ = SQL_NEW_RULE;
3465             $$->append($1);
3466             $$->append($2= newNode(".", SQL_NODE_PUNCTUATION));
3467             $$->append($3);
3468             $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION));
3469             $$->append($5);
3470             $$->append($6 = newNode(".", SQL_NODE_PUNCTUATION));
3471             $$->append($7);
3472             }
3473     |       SQL_TOKEN_NAME ':' SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val %prec '.'
3474             {$$ = SQL_NEW_RULE;
3475             $$->append($1);
3476             $$->append($2= newNode(":", SQL_NODE_PUNCTUATION));
3477             $$->append($3);
3478             $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION));
3479             $$->append($5);
3480             $$->append($6 = newNode(".", SQL_NODE_PUNCTUATION));
3481             $$->append($7);
3482             }
3483 /*  |       SQL_TOKEN_NAME ';' SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val
3484             {$$ = SQL_NEW_RULE;
3485             $$->append($1);
3486             $$->append($2= newNode(";", SQL_NODE_PUNCTUATION));
3487             $$->append($3);
3488             $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION));
3489             $$->append($5);
3490             $$->append($6 = newNode(".", SQL_NODE_PUNCTUATION));
3491             $$->append($7);
3492             }
3493 */  ;
3494 
3495         /* data types */
3496 column_val:
3497         column
3498         {$$ = SQL_NEW_RULE;
3499             $$->append($1);}
3500     |   '*'
3501         {
3502             $$ = SQL_NEW_RULE;
3503             $$->append($1 = newNode("*", SQL_NODE_PUNCTUATION));
3504         }
3505     ;
3506 data_type:
3507     predefined_type
3508     ;
3509 opt_char_set_spec:
3510     {$$ = SQL_NEW_RULE;}
3511     |   SQL_TOKEN_CHARACTER SQL_TOKEN_SET SQL_TOKEN_NAME
3512         {
3513             $$ = SQL_NEW_RULE;
3514             $$->append($1);
3515             $$->append($2);
3516             $$->append($3);
3517         }
3518     ;
3519 opt_collate_clause:
3520     {$$ = SQL_NEW_RULE;}
3521     | collate_clause
3522     ;
3523 predefined_type:
3524         character_string_type opt_char_set_spec opt_collate_clause
3525         {
3526             $$ = SQL_NEW_RULE;
3527             $$->append($1);
3528             $$->append($2);
3529             $$->append($3);
3530         }
3531     |   national_character_string_type opt_collate_clause
3532         {
3533             $$ = SQL_NEW_RULE;
3534             $$->append($1);
3535             $$->append($2);
3536         }
3537     |   binary_string_type
3538     |   numeric_type
3539     |   boolean_type
3540     |   datetime_type
3541     |   interval_type
3542     ;
3543 character_string_type:
3544         SQL_TOKEN_CHARACTER opt_paren_precision
3545         {
3546             $$ = SQL_NEW_RULE;
3547             $$->append($1);
3548             $$->append($2);
3549         }
3550     |   SQL_TOKEN_CHAR opt_paren_precision
3551         {
3552             $$ = SQL_NEW_RULE;
3553             $$->append($1);
3554             $$->append($2);
3555         }
3556     |   SQL_TOKEN_CHARACTER SQL_TOKEN_VARYING paren_char_length
3557         {
3558             $$ = SQL_NEW_RULE;
3559             $$->append($1);
3560             $$->append($2);
3561             $$->append($3);
3562         }
3563     |   SQL_TOKEN_CHAR SQL_TOKEN_VARYING paren_char_length
3564         {
3565             $$ = SQL_NEW_RULE;
3566             $$->append($1);
3567             $$->append($2);
3568             $$->append($3);
3569         }
3570     |   SQL_TOKEN_VARCHAR paren_char_length
3571         {
3572             $$ = SQL_NEW_RULE;
3573             $$->append($1);
3574             $$->append($2);
3575         }
3576     | character_large_object_type
3577     ;
3578 opt_paren_precision:
3579         {$$ = SQL_NEW_RULE;}
3580     |   paren_char_length
3581     ;
3582 paren_char_length:
3583     '(' SQL_TOKEN_INTNUM ')'
3584     {
3585         $$ = SQL_NEW_RULE;
3586         $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
3587         $$->append($2);
3588         $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
3589     }
3590     ;
3591 opt_paren_char_large_length:
3592         {$$ = SQL_NEW_RULE;}
3593     |   paren_character_large_object_length
3594     ;
3595 paren_character_large_object_length:
3596     '(' large_object_length ')'
3597     {
3598         $$ = SQL_NEW_RULE;
3599         $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
3600         $$->append($2);
3601         $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
3602     }
3603     ;
3604 
3605 large_object_length:
3606     SQL_TOKEN_INTNUM opt_multiplier
3607     {
3608         $$ = SQL_NEW_RULE;
3609         $$->append($1);
3610         $$->append($2);
3611     }
3612     ;
3613 opt_multiplier:
3614     {$$ = SQL_NEW_RULE;}
3615     |   'K'
3616         {
3617             $$ = SQL_NEW_RULE;
3618             $$->append($1 = newNode("K", SQL_NODE_PUNCTUATION));
3619         }
3620     |   'M'
3621         {
3622             $$ = SQL_NEW_RULE;
3623             $$->append($1 = newNode("M", SQL_NODE_PUNCTUATION));
3624         }
3625     |   'G'
3626         {
3627             $$ = SQL_NEW_RULE;
3628             $$->append($1 = newNode("G", SQL_NODE_PUNCTUATION));
3629         }
3630     |   'T'
3631         {
3632             $$ = SQL_NEW_RULE;
3633             $$->append($1 = newNode("T", SQL_NODE_PUNCTUATION));
3634         }
3635     |   'P'
3636         {
3637             $$ = SQL_NEW_RULE;
3638             $$->append($1 = newNode("P", SQL_NODE_PUNCTUATION));
3639         }
3640     ;
3641 character_large_object_type:
3642         SQL_TOKEN_CHARACTER SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
3643     {
3644             $$ = SQL_NEW_RULE;
3645             $$->append($1);
3646             $$->append($2);
3647             $$->append($3);
3648             $$->append($4);
3649         }
3650     |   SQL_TOKEN_CHAR SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
3651         {
3652             $$ = SQL_NEW_RULE;
3653             $$->append($1);
3654             $$->append($2);
3655             $$->append($3);
3656             $$->append($4);
3657         }
3658     |   SQL_TOKEN_CLOB opt_paren_char_large_length
3659         {
3660             $$ = SQL_NEW_RULE;
3661             $$->append($1);
3662             $$->append($2);
3663         }
3664     ;
3665 national_character_string_type:
3666         SQL_TOKEN_NATIONAL SQL_TOKEN_CHARACTER opt_paren_precision
3667         {
3668             $$ = SQL_NEW_RULE;
3669             $$->append($1);
3670             $$->append($2);
3671             $$->append($3);
3672         }
3673     |   SQL_TOKEN_NATIONAL SQL_TOKEN_CHAR opt_paren_precision
3674         {
3675             $$ = SQL_NEW_RULE;
3676             $$->append($1);
3677             $$->append($2);
3678             $$->append($3);
3679         }
3680     |   SQL_TOKEN_NCHAR opt_paren_precision
3681         {
3682             $$ = SQL_NEW_RULE;
3683             $$->append($1);
3684             $$->append($2);
3685         }
3686     |   SQL_TOKEN_NATIONAL SQL_TOKEN_CHARACTER SQL_TOKEN_VARYING paren_char_length
3687         {
3688             $$ = SQL_NEW_RULE;
3689             $$->append($1);
3690             $$->append($2);
3691             $$->append($3);
3692             $$->append($4);
3693         }
3694     |   SQL_TOKEN_NATIONAL SQL_TOKEN_CHAR SQL_TOKEN_VARYING paren_char_length
3695         {
3696             $$ = SQL_NEW_RULE;
3697             $$->append($1);
3698             $$->append($2);
3699             $$->append($3);
3700             $$->append($4);
3701         }
3702     |   SQL_TOKEN_NCHAR SQL_TOKEN_VARYING paren_char_length
3703         {
3704             $$ = SQL_NEW_RULE;
3705             $$->append($1);
3706             $$->append($2);
3707             $$->append($3);
3708         }
3709     |   national_character_large_object_type
3710     ;
3711 national_character_large_object_type:
3712         SQL_TOKEN_NATIONAL SQL_TOKEN_CHARACTER SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
3713         {
3714             $$ = SQL_NEW_RULE;
3715             $$->append($1);
3716             $$->append($2);
3717             $$->append($3);
3718             $$->append($4);
3719             $$->append($5);
3720         }
3721     |   SQL_TOKEN_NCHAR SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
3722         {
3723             $$ = SQL_NEW_RULE;
3724             $$->append($1);
3725             $$->append($2);
3726             $$->append($3);
3727             $$->append($4);
3728         }
3729     |   SQL_TOKEN_NCLOB opt_paren_char_large_length
3730         {
3731             $$ = SQL_NEW_RULE;
3732             $$->append($1);
3733             $$->append($2);
3734         }
3735     ;
3736 binary_string_type:
3737         SQL_TOKEN_BINARY opt_paren_precision
3738         {
3739             $$ = SQL_NEW_RULE;
3740             $$->append($1);
3741             $$->append($2);
3742         }
3743     |   SQL_TOKEN_BINARY SQL_TOKEN_VARYING paren_char_length
3744         {
3745             $$ = SQL_NEW_RULE;
3746             $$->append($1);
3747             $$->append($2);
3748             $$->append($3);
3749         }
3750     |   SQL_TOKEN_VARBINARY paren_char_length
3751         {
3752             $$ = SQL_NEW_RULE;
3753             $$->append($1);
3754             $$->append($2);
3755         }
3756     |   binary_large_object_string_type
3757     ;
3758 binary_large_object_string_type:
3759         SQL_TOKEN_BINARY SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
3760         {
3761             $$ = SQL_NEW_RULE;
3762             $$->append($1);
3763             $$->append($2);
3764             $$->append($3);
3765             $$->append($4);
3766         }
3767     |   SQL_TOKEN_BLOB opt_paren_char_large_length
3768         {
3769             $$ = SQL_NEW_RULE;
3770             $$->append($1);
3771             $$->append($2);
3772         }
3773     ;
3774 numeric_type:
3775         exact_numeric_type
3776     |   approximate_numeric_type
3777     ;
3778 opt_paren_precision_scale:
3779     {$$ = SQL_NEW_RULE;}
3780     |   '(' SQL_TOKEN_INTNUM ')'
3781         {
3782             $$ = SQL_NEW_RULE;
3783             $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
3784             $$->append($2);
3785             $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
3786         }
3787     |   '(' SQL_TOKEN_INTNUM ',' SQL_TOKEN_INTNUM ')'
3788         {
3789             $$ = SQL_NEW_RULE;
3790             $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
3791             $$->append($2);
3792             $$->append($3 = newNode(",", SQL_NODE_PUNCTUATION));
3793             $$->append($4);
3794             $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
3795         }
3796     ;
3797 exact_numeric_type:
3798         SQL_TOKEN_NUMERIC opt_paren_precision_scale
3799         {
3800             $$ = SQL_NEW_RULE;
3801             $$->append($1);
3802             $$->append($2);
3803         }
3804     |   SQL_TOKEN_DECIMAL opt_paren_precision_scale
3805         {
3806             $$ = SQL_NEW_RULE;
3807             $$->append($1);
3808             $$->append($2);
3809         }
3810     |   SQL_TOKEN_DEC opt_paren_precision_scale
3811         {
3812             $$ = SQL_NEW_RULE;
3813             $$->append($1);
3814             $$->append($2);
3815         }
3816     |   SQL_TOKEN_SMALLINT
3817     |   SQL_TOKEN_INTEGER
3818     |   SQL_TOKEN_INT
3819     |   SQL_TOKEN_BIGINT
3820     ;
3821 approximate_numeric_type:
3822         SQL_TOKEN_FLOAT '(' SQL_TOKEN_INTNUM ')'
3823         {
3824             $$ = SQL_NEW_RULE;
3825             $$->append($1);
3826             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
3827             $$->append($3);
3828             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
3829         }
3830     |   SQL_TOKEN_FLOAT
3831     |   SQL_TOKEN_REAL
3832     |   SQL_TOKEN_DOUBLE
3833     |   SQL_TOKEN_DOUBLE SQL_TOKEN_PRECISION
3834         {
3835             $$ = SQL_NEW_RULE;
3836             $$->append($1);
3837             $$->append($2);
3838         }
3839     ;
3840 boolean_type:
3841     SQL_TOKEN_BOOLEAN
3842 ;
3843 datetime_type:
3844         SQL_TOKEN_DATE
3845     |   SQL_TOKEN_TIME opt_paren_precision opt_with_or_without_time_zone
3846         {
3847             $$ = SQL_NEW_RULE;
3848             $$->append($1);
3849             $$->append($2);
3850             $$->append($3);
3851         }
3852     |   SQL_TOKEN_TIMESTAMP opt_paren_precision opt_with_or_without_time_zone
3853         {
3854             $$ = SQL_NEW_RULE;
3855             $$->append($1);
3856             $$->append($2);
3857             $$->append($3);
3858         }
3859     ;
3860 opt_with_or_without_time_zone:
3861         {$$ = SQL_NEW_RULE;}
3862     |   SQL_TOKEN_WITH SQL_TOKEN_TIME SQL_TOKEN_ZONE
3863         {
3864             $$ = SQL_NEW_RULE;
3865             $$->append($1);
3866             $$->append($2);
3867             $$->append($3);
3868         }
3869     |   SQL_TOKEN_WITHOUT SQL_TOKEN_TIME SQL_TOKEN_ZONE
3870         {
3871             $$ = SQL_NEW_RULE;
3872             $$->append($1);
3873             $$->append($2);
3874             $$->append($3);
3875         }
3876     ;
3877 interval_type:
3878     SQL_TOKEN_INTERVAL interval_qualifier
3879     {
3880         $$ = SQL_NEW_RULE;
3881         $$->append($1);
3882         $$->append($2);
3883     }
3884     ;
3885     /* the various things you can name */
3886 
3887 column:
3888         SQL_TOKEN_NAME
3889     |   SQL_TOKEN_POSITION
3890         {
3891             sal_uInt32 nNod = $$->getRuleID();
3892             delete $$;
3893             $$ = newNode(xxx_pGLOBAL_SQLPARSER->TokenIDToStr(nNod), SQL_NODE_NAME);
3894         }
3895     |   SQL_TOKEN_CHAR_LENGTH
3896         {
3897             sal_uInt32 nNod = $$->getRuleID();
3898             delete $$;
3899             $$ = newNode(xxx_pGLOBAL_SQLPARSER->TokenIDToStr(nNod), SQL_NODE_NAME);
3900         }
3901     |   SQL_TOKEN_EXTRACT
3902         {
3903             sal_uInt32 nNod = $$->getRuleID();
3904             delete $$;
3905             $$ = newNode(xxx_pGLOBAL_SQLPARSER->TokenIDToStr(nNod), SQL_NODE_NAME);
3906         }
3907     ;
3908 case_expression:
3909         case_abbreviation
3910     |   case_specification
3911     ;
3912 case_abbreviation:
3913         SQL_TOKEN_NULLIF '(' value_exp_commalist ')'
3914         {
3915             $$ = SQL_NEW_RULE;
3916             $$->append($1);
3917             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
3918             $$->append($3);
3919             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
3920         }
3921     |   SQL_TOKEN_COALESCE '(' value_exp ')'
3922         {
3923             $$ = SQL_NEW_RULE;
3924             $$->append($1);
3925             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
3926             $$->append($3);
3927             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
3928         }
3929     |   SQL_TOKEN_COALESCE '(' value_exp_commalist ')'
3930         {
3931             $$ = SQL_NEW_RULE;
3932             $$->append($1);
3933             $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
3934             $$->append($3);
3935             $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
3936         }
3937     ;
3938 case_specification:
3939         simple_case
3940     |   searched_case
3941     ;
3942 simple_case:
3943     SQL_TOKEN_CASE case_operand simple_when_clause_list else_clause SQL_TOKEN_END
3944         {
3945             $$ = SQL_NEW_RULE;
3946             $$->append($1);
3947             $$->append($2);
3948             $$->append($3);
3949             $$->append($4);
3950             $$->append($5);
3951         }
3952     ;
3953 searched_case:
3954     SQL_TOKEN_CASE searched_when_clause_list else_clause SQL_TOKEN_END
3955         {
3956             $$ = SQL_NEW_RULE;
3957             $$->append($1);
3958             $$->append($2);
3959             $$->append($3);
3960             $$->append($4);
3961         }
3962     ;
3963 simple_when_clause_list:
3964         simple_when_clause
3965         {
3966             $$ = SQL_NEW_LISTRULE;
3967             $$->append($1);
3968         }
3969     |   searched_when_clause_list simple_when_clause
3970         {
3971             $1->append($2);
3972             $$ = $1;
3973         }
3974     ;
3975 simple_when_clause:
3976     SQL_TOKEN_WHEN when_operand_list SQL_TOKEN_THEN result
3977     {
3978             $$ = SQL_NEW_RULE;
3979             $$->append($1);
3980             $$->append($2);
3981             $$->append($3);
3982             $$->append($4);
3983         }
3984     ;
3985 when_operand_list:
3986         when_operand
3987         {$$ = SQL_NEW_COMMALISTRULE;
3988         $$->append($1);}
3989     |   when_operand_list ',' when_operand
3990         {$1->append($3);
3991         $$ = $1;}
3992     ;
3993 when_operand:
3994         row_value_constructor_elem
3995     |   comparison_predicate_part_2
3996     |   between_predicate_part_2
3997     |   in_predicate_part_2
3998     |   character_like_predicate_part_2
3999     |   null_predicate_part_2
4000 ;
4001 searched_when_clause_list:
4002         searched_when_clause
4003         {
4004             $$ = SQL_NEW_LISTRULE;
4005             $$->append($1);
4006         }
4007     |   searched_when_clause_list searched_when_clause
4008         {
4009             $1->append($2);
4010             $$ = $1;
4011         }
4012     ;
4013 searched_when_clause:
4014     SQL_TOKEN_WHEN search_condition SQL_TOKEN_THEN result
4015     {
4016             $$ = SQL_NEW_RULE;
4017             $$->append($1);
4018             $$->append($2);
4019             $$->append($3);
4020             $$->append($4);
4021         }
4022     ;
4023 else_clause:
4024         {$$ = SQL_NEW_RULE;}
4025     |   SQL_TOKEN_ELSE result
4026         {
4027             $$ = SQL_NEW_RULE;
4028             $$->append($1);
4029             $$->append($2);
4030         }
4031     ;
4032 result:
4033         result_expression
4034     |   SQL_TOKEN_NULL
4035     ;
4036 result_expression:
4037     value_exp
4038     ;
4039 case_operand:
4040     row_value_constructor_elem
4041     ;
4042 
4043 cursor: SQL_TOKEN_NAME
4044             {$$ = SQL_NEW_RULE;
4045             $$->append($1);}
4046     ;
4047 
4048 /***
4049 module: SQL_TOKEN_NAME
4050             {$$ = SQL_NEW_RULE;
4051             $$->append($1);}
4052     ;
4053 ***/
4054 
4055 parameter:
4056         ':' SQL_TOKEN_NAME
4057             {$$ = SQL_NEW_RULE;
4058             $$->append($1 = newNode(":", SQL_NODE_PUNCTUATION));
4059             $$->append($2);}
4060     |   '?'
4061             {$$ = SQL_NEW_RULE; // test
4062             $$->append($1 = newNode("?", SQL_NODE_PUNCTUATION));}
4063     |   '[' SQL_TOKEN_NAME ']'
4064             {$$ = SQL_NEW_RULE;
4065             $$->append($1 = newNode("[", SQL_NODE_PUNCTUATION));
4066             $$->append($2);
4067             $$->append($3 = newNode("]", SQL_NODE_PUNCTUATION));}
4068     ;
4069 
4070 /***
4071 procedure:      SQL_TOKEN_NAME
4072             {$$ = SQL_NEW_RULE;
4073             $$->append($1);}
4074     ;
4075 ***/
4076 
4077 range_variable:
4078         {$$ = SQL_NEW_RULE;}
4079     |   opt_as SQL_TOKEN_NAME
4080         {$$ = SQL_NEW_RULE;
4081         $$->append($1);
4082         $$->append($2);
4083         }
4084     ;
4085 
4086 user:   SQL_TOKEN_NAME
4087     ;
4088 
4089 /* PREDICATECHECK RULES */
4090 sql:
4091         search_condition /* checking predicats */
4092         {
4093             if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // sql: rule 1
4094             {
4095                 $$ = $1;
4096                 if ( SQL_ISRULE($$,search_condition) )
4097                 {
4098                     $$->insert(0,newNode("(", SQL_NODE_PUNCTUATION));
4099                     $$->append(newNode(")", SQL_NODE_PUNCTUATION));
4100                 }
4101             }
4102             else
4103                 YYERROR;
4104         }
4105     |   '(' sql ')' /* checking predicats */
4106     ;
4107 trigger_definition:
4108     SQL_TOKEN_CREATE SQL_TOKEN_TRIGGER trigger_name trigger_action_time trigger_event SQL_TOKEN_ON table_name op_referencing triggered_action
4109     {
4110         $$ = SQL_NEW_RULE;
4111         $$->append($1);
4112         $$->append($2);
4113         $$->append($3);
4114         $$->append($4);
4115         $$->append($5);
4116         $$->append($6);
4117         $$->append($7);
4118         $$->append($8);
4119         $$->append($9);
4120     }
4121     ;
4122 op_referencing:
4123     {
4124         $$ = SQL_NEW_RULE;
4125     }
4126     |   SQL_TOKEN_REFERENCING transition_table_or_variable_list
4127     {
4128         $$ = SQL_NEW_RULE;
4129         $$->append($1);
4130         $$->append($2);
4131     }
4132     ;
4133 trigger_action_time:
4134         SQL_TOKEN_BEFORE
4135     |   SQL_TOKEN_AFTER
4136     |   SQL_TOKEN_INSTEAD SQL_TOKEN_OF
4137     {
4138         $$ = SQL_NEW_RULE;
4139         $$->append($1);
4140         $$->append($2);
4141     }
4142 ;
4143 trigger_event:
4144         SQL_TOKEN_INSERT
4145     |   SQL_TOKEN_DELETE
4146     |   SQL_TOKEN_UPDATE op_trigger_columnlist
4147     {
4148         $$ = SQL_NEW_RULE;
4149         $$->append($1);
4150         $$->append($2);
4151     }
4152     ;
4153 op_trigger_columnlist:
4154     {
4155         $$ = SQL_NEW_RULE;
4156     }
4157     |   SQL_TOKEN_OF trigger_column_list
4158     {
4159         $$ = SQL_NEW_RULE;
4160         $$->append($1);
4161         $$->append($2);
4162     }
4163     ;
4164 trigger_column_list:
4165     column_commalist
4166     ;
4167 triggered_action:
4168     op_triggered_action_for triggered_when_clause triggered_SQL_statement
4169     {
4170         $$ = SQL_NEW_RULE;
4171         $$->append($1);
4172         $$->append($2);
4173         $$->append($3);
4174     }
4175     ;
4176 op_triggered_action_for:
4177         {
4178         $$ = SQL_NEW_RULE;
4179         }
4180     |   SQL_TOKEN_FOR SQL_TOKEN_EACH trigger_for
4181     {
4182         $$ = SQL_NEW_RULE;
4183         $$->append($1);
4184         $$->append($2);
4185         $$->append($3);
4186     }
4187     ;
4188 trigger_for:
4189         SQL_TOKEN_ROW
4190     |   SQL_TOKEN_STATEMENT
4191     ;
4192 triggered_when_clause:
4193     {
4194         $$ = SQL_NEW_RULE;
4195     }
4196     |   SQL_TOKEN_WHEN parenthesized_boolean_value_expression
4197     {
4198         $$ = SQL_NEW_RULE;
4199         $$->append($1);
4200         $$->append($2);
4201     }
4202     ;
4203 triggered_SQL_statement:
4204         SQL_procedure_statement
4205     |   SQL_TOKEN_BEGIN SQL_TOKEN_ATOMIC SQL_procedure_statement_list ';' SQL_TOKEN_END
4206     {
4207         $$ = SQL_NEW_RULE;
4208         $$->append($1);
4209         $$->append($2);
4210         $$->append($3);
4211         $$->append($4 = newNode(";", SQL_NODE_PUNCTUATION));
4212         $$->append($5);
4213     }
4214     ;
4215 SQL_procedure_statement_list:
4216         SQL_procedure_statement
4217         {
4218             $$ = SQL_NEW_LISTRULE;
4219             $$->append($1);
4220         }
4221     |   SQL_procedure_statement_list ';' SQL_procedure_statement
4222         {
4223             $1->append($3);
4224             $$ = $1;
4225         }
4226     ;
4227 SQL_procedure_statement:
4228     sql
4229     ;
4230 
4231 transition_table_or_variable_list:
4232         transition_table_or_variable
4233         {
4234             $$ = SQL_NEW_LISTRULE;
4235             $$->append($1);
4236         }
4237     |   transition_table_or_variable_list transition_table_or_variable
4238         {
4239             $1->append($2);
4240             $$ = $1;
4241         }
4242     ;
4243 
4244 transition_table_or_variable:
4245         SQL_TOKEN_OLD opt_row opt_as old_transition_variable_name
4246     {
4247         $$ = SQL_NEW_RULE;
4248         $$->append($1);
4249         $$->append($2);
4250         $$->append($3);
4251         $$->append($4);
4252     }
4253     |   SQL_TOKEN_NEW opt_row opt_as new_transition_variable_name
4254     {
4255         $$ = SQL_NEW_RULE;
4256         $$->append($1);
4257         $$->append($2);
4258         $$->append($3);
4259         $$->append($4);
4260     }
4261     |   SQL_TOKEN_OLD SQL_TOKEN_TABLE opt_as old_transition_table_name
4262     {
4263         $$ = SQL_NEW_RULE;
4264         $$->append($1);
4265         $$->append($2);
4266         $$->append($3);
4267         $$->append($4);
4268     }
4269     |   SQL_TOKEN_NEW SQL_TOKEN_TABLE opt_as new_transition_table_name
4270     {
4271         $$ = SQL_NEW_RULE;
4272         $$->append($1);
4273         $$->append($2);
4274         $$->append($3);
4275         $$->append($4);
4276     }
4277 ;
4278 old_transition_table_name:
4279     transition_table_name
4280 ;
4281 new_transition_table_name:
4282     transition_table_name
4283 ;
4284 transition_table_name:
4285     SQL_TOKEN_NAME
4286 ;
4287 old_transition_variable_name:
4288     SQL_TOKEN_NAME
4289 ;
4290 new_transition_variable_name:
4291     SQL_TOKEN_NAME
4292 ;
4293 trigger_name:
4294     SQL_TOKEN_NAME
4295 ;
4296 %%
4297 
4298 
4299 using namespace ::com::sun::star::sdbc;
4300 using namespace ::com::sun::star::beans;
4301 using namespace ::com::sun::star::uno;
4302 using namespace ::com::sun::star::i18n;
4303 using namespace ::com::sun::star::lang;
4304 using namespace ::com::sun::star::util;
4305 using namespace ::osl;
4306 using namespace ::dbtools;
4307 //  using namespace connectivity;
4308 
4309 //============================================================
4310 //= a helper for static ascii pseudo-unicode strings
4311 //============================================================
4312 // string constants
4313 struct _ConstAsciiString_
4314 {
4315     sal_Int32 length;
4316     sal_Char  const* str;
4317 
4318     operator rtl::OUString () const { return rtl::OUString(str, length, RTL_TEXTENCODING_ASCII_US); }
4319 //  operator ::rtl::OUString () const { return ::rtl::OUString(str, length, RTL_TEXTENCODING_ASCII_US); }
4320     operator const sal_Char * () const { return str; }
4321     operator ::rtl::OString() const { return str; }
4322 };
4323 
4324 #define IMPLEMENT_CONSTASCII_STRING( name, string ) \
4325     _ConstAsciiString_ const name = { sizeof(string)-1, string }
4326 
4327 IMPLEMENT_CONSTASCII_STRING(ERROR_STR_GENERAL, "Syntax error in SQL expression");
4328 IMPLEMENT_CONSTASCII_STRING(ERROR_STR_VALUE_NO_LIKE, "The value #1 can not be used with LIKE.");
4329 IMPLEMENT_CONSTASCII_STRING(ERROR_STR_FIELD_NO_LIKE, "LIKE can not be used with this field.");
4330 IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_COMPARE, "The entered criterion can not be compared with this field.");
4331 IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_DATE_COMPARE, "The field can not be compared with a date.");
4332 IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_REAL_COMPARE, "The field can not be compared with a floating point number.");
4333 IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_INT_COMPARE,  "The field can not be compared with a number.");
4334 IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_TABLE,    "The database does not contain a table named \"#\".");
4335 IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_TABLE_OR_QUERY,   "The database does contain neither a table nor a query named \"#\".");
4336 IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_COLUMN,   "The column \"#1\" is unknown in the table \"#2\".");
4337 IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_TABLE_EXIST,  "The database already contains a table or view with name \"#\".");
4338 IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_QUERY_EXIST,  "The database already contains a query with name \"#\".");
4339 
4340 IMPLEMENT_CONSTASCII_STRING(KEY_STR_LIKE, "LIKE");
4341 IMPLEMENT_CONSTASCII_STRING(KEY_STR_NOT, "NOT");
4342 IMPLEMENT_CONSTASCII_STRING(KEY_STR_NULL, "NULL");
4343 IMPLEMENT_CONSTASCII_STRING(KEY_STR_TRUE, "True");
4344 IMPLEMENT_CONSTASCII_STRING(KEY_STR_FALSE, "False");
4345 IMPLEMENT_CONSTASCII_STRING(KEY_STR_IS, "IS");
4346 IMPLEMENT_CONSTASCII_STRING(KEY_STR_BETWEEN, "BETWEEN");
4347 IMPLEMENT_CONSTASCII_STRING(KEY_STR_OR, "OR");
4348 IMPLEMENT_CONSTASCII_STRING(KEY_STR_AND, "AND");
4349 IMPLEMENT_CONSTASCII_STRING(KEY_STR_AVG, "AVG");
4350 IMPLEMENT_CONSTASCII_STRING(KEY_STR_COUNT, "COUNT");
4351 IMPLEMENT_CONSTASCII_STRING(KEY_STR_MAX, "MAX");
4352 IMPLEMENT_CONSTASCII_STRING(KEY_STR_MIN, "MIN");
4353 IMPLEMENT_CONSTASCII_STRING(KEY_STR_SUM, "SUM");
4354 IMPLEMENT_CONSTASCII_STRING(KEY_STR_EVERY, "EVERY");
4355 IMPLEMENT_CONSTASCII_STRING(KEY_STR_ANY, "ANY");
4356 IMPLEMENT_CONSTASCII_STRING(KEY_STR_SOME, "SOME");
4357 IMPLEMENT_CONSTASCII_STRING(KEY_STR_STDDEV_POP, "STDDEV_POP");
4358 IMPLEMENT_CONSTASCII_STRING(KEY_STR_STDDEV_SAMP, "STDDEV_SAMP");
4359 IMPLEMENT_CONSTASCII_STRING(KEY_STR_VAR_SAMP, "VAR_SAMP");
4360 IMPLEMENT_CONSTASCII_STRING(KEY_STR_VAR_POP, "VAR_POP");
4361 IMPLEMENT_CONSTASCII_STRING(KEY_STR_COLLECT, "COLLECT");
4362 IMPLEMENT_CONSTASCII_STRING(KEY_STR_FUSION, "FUSION");
4363 IMPLEMENT_CONSTASCII_STRING(KEY_STR_INTERSECTION, "INTERSECTION");
4364 
4365 IMPLEMENT_CONSTASCII_STRING(FIELD_STR_NULLDATE, "NullDate");
4366 
4367 IMPLEMENT_CONSTASCII_STRING(STR_SQL_TOKEN, "SQL_TOKEN_");
4368 
4369 //==========================================================================
4370 //= OParseContext
4371 //==========================================================================
4372 //-----------------------------------------------------------------------------
4373 OParseContext::OParseContext()
4374 {
4375 }
4376 
4377 //-----------------------------------------------------------------------------
4378 OParseContext::~OParseContext()
4379 {
4380 }
4381 
4382 //-----------------------------------------------------------------------------
4383 ::rtl::OUString OParseContext::getErrorMessage(ErrorCode _eCode) const
4384 {
4385     ::rtl::OUString aMsg;
4386     switch (_eCode)
4387     {
4388         case ERROR_GENERAL:                 aMsg = ERROR_STR_GENERAL; break;
4389         case ERROR_VALUE_NO_LIKE:           aMsg = ERROR_STR_VALUE_NO_LIKE; break;
4390         case ERROR_FIELD_NO_LIKE:           aMsg = ERROR_STR_FIELD_NO_LIKE; break;
4391         case ERROR_INVALID_COMPARE:         aMsg = ERROR_STR_INVALID_COMPARE; break;
4392         case ERROR_INVALID_INT_COMPARE:     aMsg = ERROR_STR_INVALID_INT_COMPARE; break;
4393         case ERROR_INVALID_DATE_COMPARE:    aMsg = ERROR_STR_INVALID_DATE_COMPARE; break;
4394         case ERROR_INVALID_REAL_COMPARE:    aMsg = ERROR_STR_INVALID_REAL_COMPARE; break;
4395         case ERROR_INVALID_TABLE:           aMsg = ERROR_STR_INVALID_TABLE; break;
4396         case ERROR_INVALID_TABLE_OR_QUERY:  aMsg = ERROR_STR_INVALID_TABLE_OR_QUERY; break;
4397         case ERROR_INVALID_COLUMN:          aMsg = ERROR_STR_INVALID_COLUMN; break;
4398         case ERROR_INVALID_TABLE_EXIST:     aMsg = ERROR_STR_INVALID_TABLE_EXIST; break;
4399         case ERROR_INVALID_QUERY_EXIST:     aMsg = ERROR_STR_INVALID_QUERY_EXIST; break;
4400         default:
4401             OSL_ENSURE( false, "OParseContext::getErrorMessage: unknown error code!" );
4402             break;
4403     }
4404     return aMsg;
4405 }
4406 
4407 //-----------------------------------------------------------------------------
4408 ::rtl::OString OParseContext::getIntlKeywordAscii(InternationalKeyCode _eKey) const
4409 {
4410     ::rtl::OString aKeyword;
4411     switch (_eKey)
4412     {
4413         case KEY_LIKE:      aKeyword = KEY_STR_LIKE; break;
4414         case KEY_NOT:       aKeyword = KEY_STR_NOT; break;
4415         case KEY_NULL:      aKeyword = KEY_STR_NULL; break;
4416         case KEY_TRUE:      aKeyword = KEY_STR_TRUE; break;
4417         case KEY_FALSE:     aKeyword = KEY_STR_FALSE; break;
4418         case KEY_IS:        aKeyword = KEY_STR_IS; break;
4419         case KEY_BETWEEN:   aKeyword = KEY_STR_BETWEEN; break;
4420         case KEY_OR:        aKeyword = KEY_STR_OR; break;
4421         case KEY_AND:       aKeyword = KEY_STR_AND; break;
4422         case KEY_AVG:       aKeyword = KEY_STR_AVG; break;
4423         case KEY_COUNT:     aKeyword = KEY_STR_COUNT; break;
4424         case KEY_MAX:       aKeyword = KEY_STR_MAX; break;
4425         case KEY_MIN:       aKeyword = KEY_STR_MIN; break;
4426         case KEY_SUM:       aKeyword = KEY_STR_SUM; break;
4427         case KEY_EVERY:     aKeyword = KEY_STR_EVERY; break;
4428         case KEY_ANY:       aKeyword = KEY_STR_ANY; break;
4429         case KEY_SOME:      aKeyword = KEY_STR_SOME; break;
4430         case KEY_STDDEV_POP: aKeyword = KEY_STR_STDDEV_POP; break;
4431         case KEY_STDDEV_SAMP: aKeyword = KEY_STR_STDDEV_SAMP; break;
4432         case KEY_VAR_SAMP:  aKeyword = KEY_STR_VAR_SAMP; break;
4433         case KEY_VAR_POP:   aKeyword = KEY_STR_VAR_POP; break;
4434         case KEY_COLLECT:   aKeyword = KEY_STR_COLLECT; break;
4435         case KEY_FUSION:    aKeyword = KEY_STR_FUSION; break;
4436         case KEY_INTERSECTION:aKeyword = KEY_STR_INTERSECTION; break;
4437         case KEY_NONE:      break;
4438         default:
4439             OSL_ENSURE( false, "OParseContext::getIntlKeywordAscii: unknown key!" );
4440             break;
4441     }
4442     return aKeyword;
4443 }
4444 
4445 //-----------------------------------------------------------------------------
4446 IParseContext::InternationalKeyCode OParseContext::getIntlKeyCode(const ::rtl::OString& rToken) const
4447 {
4448     static IParseContext::InternationalKeyCode Intl_TokenID[] =
4449     {
4450         KEY_LIKE, KEY_NOT, KEY_NULL, KEY_TRUE,
4451         KEY_FALSE, KEY_IS, KEY_BETWEEN, KEY_OR,
4452         KEY_AND, KEY_AVG, KEY_COUNT, KEY_MAX,
4453         KEY_MIN, KEY_SUM, KEY_EVERY,KEY_ANY,KEY_SOME,
4454         KEY_STDDEV_POP,KEY_STDDEV_SAMP,KEY_VAR_SAMP,
4455         KEY_VAR_POP,KEY_COLLECT,KEY_FUSION,KEY_INTERSECTION
4456     };
4457 
4458     sal_uInt32 nCount = sizeof Intl_TokenID / sizeof Intl_TokenID[0];
4459     for (sal_uInt32 i = 0; i < nCount; i++)
4460     {
4461         ::rtl::OString aKey = getIntlKeywordAscii(Intl_TokenID[i]);
4462         if (rToken.equalsIgnoreAsciiCase(aKey))
4463             return Intl_TokenID[i];
4464     }
4465 
4466     return KEY_NONE;
4467 }
4468 
4469 //------------------------------------------------------------------------------
4470 static Locale& impl_getLocaleInstance( )
4471 {
4472     static Locale s_aLocale(
4473         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "en" ) ),
4474         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "US" ) ),
4475         ::rtl::OUString( )
4476     );
4477     return s_aLocale;
4478 }
4479 
4480 //------------------------------------------------------------------------------
4481 void OParseContext::setDefaultLocale( const ::com::sun::star::lang::Locale& _rLocale )
4482 {
4483     impl_getLocaleInstance() = _rLocale;
4484 }
4485 
4486 //------------------------------------------------------------------------------
4487 Locale OParseContext::getPreferredLocale( ) const
4488 {
4489     return getDefaultLocale();
4490 }
4491 
4492 //------------------------------------------------------------------------------
4493 const Locale& OParseContext::getDefaultLocale()
4494 {
4495     return impl_getLocaleInstance();
4496 }
4497 
4498 //==========================================================================
4499 //= misc
4500 //==========================================================================
4501 // Der (leider globale) yylval fuer die Uebergabe von
4502 // Werten vom Scanner an den Parser. Die globale Variable
4503 // wird nur kurzzeitig verwendet, der Parser liest die Variable
4504 // sofort nach dem Scanner-Aufruf in eine gleichnamige eigene
4505 // Member-Variable.
4506 
4507 const double fMilliSecondsPerDay = 86400000.0;
4508 
4509 //------------------------------------------------------------------------------
4510 
4511 
4512 //------------------------------------------------------------------
4513 ::rtl::OUString ConvertLikeToken(const OSQLParseNode* pTokenNode, const OSQLParseNode* pEscapeNode, sal_Bool bInternational)
4514 {
4515     ::rtl::OUStringBuffer aMatchStr;
4516     if (pTokenNode->isToken())
4517     {
4518         sal_Unicode cEscape = 0;
4519         if (pEscapeNode->count())
4520             cEscape = pEscapeNode->getChild(1)->getTokenValue().toChar();
4521 
4522         // Platzhalter austauschen
4523         aMatchStr = pTokenNode->getTokenValue();
4524         const sal_Int32 nLen = aMatchStr.getLength();
4525         ::rtl::OUStringBuffer sSearch,sReplace;
4526         if ( bInternational )
4527         {
4528             sSearch.appendAscii("%_",2);
4529             sReplace.appendAscii("*?",2);
4530         }
4531         else
4532         {
4533             sSearch.appendAscii("*?",2);
4534             sReplace.appendAscii("%_",2);
4535         }
4536 
4537         for (sal_Int32 i = 0; i < nLen; i++)
4538         {
4539             const sal_Unicode c = aMatchStr.charAt(i);
4540             if (c == sSearch.charAt(0) || c == sSearch.charAt(1))
4541             {
4542                 if (i > 0 && aMatchStr.charAt(i-1) == cEscape)
4543                     continue;
4544                 else
4545                 {
4546                     const sal_Unicode cCharacter = sReplace.charAt( (c == sSearch.charAt(0)) ? 0 : 1);
4547                     aMatchStr.setCharAt(i , cCharacter);
4548                 }
4549             }
4550         }
4551     }
4552     return aMatchStr.makeStringAndClear();
4553 }
4554 
4555 //==========================================================================
4556 //= OSQLParser
4557 //==========================================================================
4558 
4559 sal_uInt32              OSQLParser::s_nRuleIDs[OSQLParseNode::rule_count + 1];
4560 OSQLParser::RuleIDMap   OSQLParser::s_aReverseRuleIDLookup;
4561 OParseContext           OSQLParser::s_aDefaultContext;
4562 
4563 sal_Int32           OSQLParser::s_nRefCount = 0;
4564 //  ::osl::Mutex        OSQLParser::s_aMutex;
4565 OSQLScanner*        OSQLParser::s_pScanner = 0;
4566 OSQLParseNodesGarbageCollector*     OSQLParser::s_pGarbageCollector = 0;
4567 ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XLocaleData>      OSQLParser::s_xLocaleData = NULL;
4568 //-----------------------------------------------------------------------------
4569 void setParser(OSQLParser* _pParser)
4570 {
4571     xxx_pGLOBAL_SQLPARSER = _pParser;
4572 }
4573 // -------------------------------------------------------------------------
4574 void OSQLParser::setParseTree(OSQLParseNode * pNewParseTree)
4575 {
4576     ::osl::MutexGuard aGuard(getMutex());
4577     m_pParseTree = pNewParseTree;
4578 }
4579 //-----------------------------------------------------------------------------
4580 OSQLParseNode* OSQLParser::parseTree(::rtl::OUString& rErrorMessage,
4581                                      const ::rtl::OUString& rStatement,
4582                                      sal_Bool bInternational)
4583 {
4584 
4585 
4586     // Guard the parsing
4587     ::osl::MutexGuard aGuard(getMutex());
4588     // must be reset
4589     setParser(this);
4590 
4591     // defines how to scan
4592     s_pScanner->SetRule(s_pScanner->GetSQLRule()); // initial
4593     s_pScanner->prepareScan(rStatement, m_pContext, bInternational);
4594 
4595     SQLyylval.pParseNode = NULL;
4596     //  SQLyypvt = NULL;
4597     m_pParseTree = NULL;
4598     m_sErrorMessage = ::rtl::OUString();
4599 
4600     // ... und den Parser anwerfen ...
4601     if (SQLyyparse() != 0)
4602     {
4603         // only set the error message, if it's not already set
4604         if (!m_sErrorMessage.getLength())
4605             m_sErrorMessage = s_pScanner->getErrorMessage();
4606         if (!m_sErrorMessage.getLength())
4607             m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_GENERAL);
4608 
4609         rErrorMessage = m_sErrorMessage;
4610 
4611         // clear the garbage collector
4612         (*s_pGarbageCollector)->clearAndDelete();
4613         return NULL;
4614     }
4615     else
4616     {
4617         (*s_pGarbageCollector)->clear();
4618 
4619         // Das Ergebnis liefern (den Root Parse Node):
4620 
4621         //  OSL_ENSURE(Sdbyyval.pParseNode != NULL,"OSQLParser: Parser hat keinen ParseNode geliefert");
4622         //  return Sdbyyval.pParseNode;
4623         // geht nicht wegen Bug in MKS YACC-erzeugtem Code (es wird ein falscher ParseNode
4624         // geliefert).
4625 
4626         // Stattdessen setzt die Parse-Routine jetzt den Member pParseTree
4627         // - einfach diesen zurueckliefern:
4628         OSL_ENSURE(m_pParseTree != NULL,"OSQLParser: Parser hat keinen ParseTree geliefert");
4629         return m_pParseTree;
4630     }
4631 }
4632 //-----------------------------------------------------------------------------
4633 ::rtl::OString OSQLParser::TokenIDToStr(sal_uInt32 nTokenID, const IParseContext* pContext)
4634 {
4635     ::rtl::OString aStr;
4636     if (pContext)
4637     {
4638         IParseContext::InternationalKeyCode eKeyCode = IParseContext::KEY_NONE;
4639         switch( nTokenID )
4640         {
4641             case SQL_TOKEN_LIKE: eKeyCode = IParseContext::KEY_LIKE; break;
4642             case SQL_TOKEN_NOT: eKeyCode = IParseContext::KEY_NOT; break;
4643             case SQL_TOKEN_NULL: eKeyCode = IParseContext::KEY_NULL; break;
4644             case SQL_TOKEN_TRUE: eKeyCode = IParseContext::KEY_TRUE; break;
4645             case SQL_TOKEN_FALSE: eKeyCode = IParseContext::KEY_FALSE; break;
4646             case SQL_TOKEN_IS: eKeyCode = IParseContext::KEY_IS; break;
4647             case SQL_TOKEN_BETWEEN: eKeyCode = IParseContext::KEY_BETWEEN; break;
4648             case SQL_TOKEN_OR: eKeyCode = IParseContext::KEY_OR; break;
4649             case SQL_TOKEN_AND: eKeyCode = IParseContext::KEY_AND; break;
4650             case SQL_TOKEN_AVG: eKeyCode = IParseContext::KEY_AVG; break;
4651             case SQL_TOKEN_COUNT: eKeyCode = IParseContext::KEY_COUNT; break;
4652             case SQL_TOKEN_MAX: eKeyCode = IParseContext::KEY_MAX; break;
4653             case SQL_TOKEN_MIN: eKeyCode = IParseContext::KEY_MIN; break;
4654             case SQL_TOKEN_SUM: eKeyCode = IParseContext::KEY_SUM; break;
4655         }
4656         if ( eKeyCode != IParseContext::KEY_NONE )
4657             aStr = pContext->getIntlKeywordAscii(eKeyCode);
4658     }
4659 
4660     if (!aStr.getLength())
4661     {
4662         aStr = yytname[YYTRANSLATE(nTokenID)];
4663         if(!aStr.compareTo("SQL_TOKEN_",10))
4664             aStr = aStr.copy(10);
4665     }
4666     return aStr;
4667 }
4668 
4669 //-----------------------------------------------------------------------------
4670 ::rtl::OUString OSQLParser::RuleIDToStr(sal_uInt32 nRuleID)
4671 {
4672     OSL_ENSURE(nRuleID < (sizeof yytname/sizeof yytname[0]), "OSQLParser::RuleIDToStr: Invalid nRuleId!");
4673     return ::rtl::OUString::createFromAscii(yytname[nRuleID]);
4674 }
4675 
4676 //-----------------------------------------------------------------------------
4677 sal_uInt32 OSQLParser::StrToRuleID(const ::rtl::OString & rValue)
4678 {
4679     // In yysvar nach dem angegebenen Namen suchen, den Index zurueckliefern
4680     // (oder 0, wenn nicht gefunden)
4681     static sal_uInt32 nLen = sizeof(yytname)/sizeof(yytname[0]);
4682     for (sal_uInt32 i = YYTRANSLATE(SQL_TOKEN_INVALIDSYMBOL); i < (nLen-1); i++)
4683     {
4684         if (yytname && rValue == yytname[i])
4685             return i;
4686     }
4687 
4688     // Nicht gefunden
4689     return 0;
4690 }
4691 
4692 //-----------------------------------------------------------------------------
4693 OSQLParseNode::Rule OSQLParser::RuleIDToRule( sal_uInt32 _nRule )
4694 {
4695     return s_aReverseRuleIDLookup[ _nRule ];
4696 }
4697 
4698 //-----------------------------------------------------------------------------
4699 sal_uInt32 OSQLParser::RuleID(OSQLParseNode::Rule eRule)
4700 {
4701     return s_nRuleIDs[(sal_uInt16)eRule];
4702 }
4703 // -------------------------------------------------------------------------
4704 sal_Int16 OSQLParser::buildNode(OSQLParseNode*& pAppend,OSQLParseNode* pCompare,OSQLParseNode* pLiteral,OSQLParseNode* pLiteral2)
4705 {
4706     OSQLParseNode* pColumnRef = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
4707     pColumnRef->append(new OSQLInternalNode(m_sFieldName,SQL_NODE_NAME));
4708     OSQLParseNode* pComp = NULL;
4709     if ( SQL_ISTOKEN( pCompare, BETWEEN) && pLiteral2 )
4710         pComp = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::between_predicate_part_2));
4711     else
4712         pComp = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::comparison_predicate));
4713 
4714     pComp->append(pColumnRef);
4715     pComp->append(pCompare);
4716     pComp->append(pLiteral);
4717     if ( pLiteral2 )
4718     {
4719         pComp->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD,SQL_TOKEN_AND));
4720         pComp->append(pLiteral2);
4721     }
4722     pAppend->append(pComp);
4723     return 1;
4724 }
4725 //-----------------------------------------------------------------------------
4726 sal_Int16 OSQLParser::buildStringNodes(OSQLParseNode*& pLiteral)
4727 {
4728     if(!pLiteral)
4729         return 1;
4730 
4731     if(SQL_ISRULE(pLiteral,set_fct_spec) || SQL_ISRULE(pLiteral,general_set_fct) || SQL_ISRULE(pLiteral,column_ref)
4732         || SQL_ISRULE(pLiteral,subquery))
4733         return 1; // here I have a function that I can't transform into a string
4734 
4735     if(pLiteral->getNodeType() == SQL_NODE_INTNUM || pLiteral->getNodeType() == SQL_NODE_APPROXNUM || pLiteral->getNodeType() == SQL_NODE_ACCESS_DATE)
4736     {
4737         OSQLParseNode* pParent = pLiteral->getParent();
4738 
4739         OSQLParseNode* pNewNode = new OSQLInternalNode(pLiteral->getTokenValue(), SQL_NODE_STRING);
4740         pParent->replace(pLiteral, pNewNode);
4741         delete pLiteral;
4742         pLiteral = NULL;
4743         return 1;
4744     }
4745 
4746     for(sal_uInt32 i=0;i<pLiteral->count();++i)
4747     {
4748         OSQLParseNode* pChild = pLiteral->getChild(i);
4749         buildStringNodes(pChild);
4750     }
4751     if(SQL_ISRULE(pLiteral,term) || SQL_ISRULE(pLiteral,value_exp_primary))
4752     {
4753         m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_COMPARE);
4754         return 0;
4755     }
4756     return 1;
4757 }
4758 //-----------------------------------------------------------------------------
4759 sal_Int16 OSQLParser::buildComparsionRule(OSQLParseNode*& pAppend,OSQLParseNode* pLiteral)
4760 {
4761     OSQLParseNode* pComp = new OSQLInternalNode(::rtl::OUString::createFromAscii("="), SQL_NODE_EQUAL);
4762     return buildPredicateRule(pAppend,pLiteral,pComp);
4763 }
4764 
4765 
4766 //-----------------------------------------------------------------------------
4767 void OSQLParser::reduceLiteral(OSQLParseNode*& pLiteral, sal_Bool bAppendBlank)
4768 {
4769     OSL_ENSURE(pLiteral->isRule(), "This is no ::com::sun::star::chaos::Rule");
4770     OSL_ENSURE(pLiteral->count() == 2, "OSQLParser::ReduceLiteral() Invalid count");
4771     OSQLParseNode* pTemp = pLiteral;
4772     ::rtl::OUStringBuffer aValue(pLiteral->getChild(0)->getTokenValue());
4773     if (bAppendBlank)
4774     {
4775         aValue.appendAscii(" ");
4776     }
4777 
4778     aValue.append(pLiteral->getChild(1)->getTokenValue());
4779 
4780     pLiteral = new OSQLInternalNode(aValue.makeStringAndClear(),SQL_NODE_STRING);
4781     delete pTemp;
4782 }
4783 
4784 // -------------------------------------------------------------------------
4785 void OSQLParser::error( const sal_Char* fmt)
4786 {
4787     if(!m_sErrorMessage.getLength())
4788     {
4789         ::rtl::OUString sStr(fmt,strlen(fmt),RTL_TEXTENCODING_UTF8);
4790         ::rtl::OUString sSQL_TOKEN(::rtl::OUString::createFromAscii("SQL_TOKEN_"));
4791 
4792         sal_Int32 nPos1 = sStr.indexOf(sSQL_TOKEN);
4793         if(nPos1 != -1)
4794         {
4795             ::rtl::OUString sFirst  = sStr.copy(0,nPos1);
4796             sal_Int32 nPos2 = sStr.indexOf(sSQL_TOKEN,nPos1+1);
4797             if(nPos2 != -1)
4798             {
4799                 ::rtl::OUString sSecond = sStr.copy(nPos1+sSQL_TOKEN.getLength(),nPos2-nPos1-sSQL_TOKEN.getLength());
4800                 sFirst  += sSecond;
4801                 sFirst  += sStr.copy(nPos2+sSQL_TOKEN.getLength());
4802             }
4803             else
4804                 sFirst += sStr.copy(nPos1+sSQL_TOKEN.getLength());
4805 
4806             m_sErrorMessage = sFirst;
4807         }
4808         else
4809             m_sErrorMessage = sStr;
4810 
4811         ::rtl::OUString aError = s_pScanner->getErrorMessage();
4812         if(aError.getLength())
4813         {
4814             m_sErrorMessage += ::rtl::OUString::createFromAscii(", ");
4815             m_sErrorMessage += aError;
4816         }
4817     }
4818 }
4819 // -------------------------------------------------------------------------
4820 int OSQLParser::SQLlex()
4821 {
4822     return s_pScanner->SQLlex();
4823 }
4824 
4825 #if defined __SUNPRO_CC
4826 #pragma enable_warn
4827 #elif defined _MSC_VER
4828 #pragma warning(pop)
4829 #endif
4830