4 * This file is part of the LibreOffice project.
6 * This Source Code Form is subject to the terms of the Mozilla Public
7 * License, v. 2.0. If a copy of the MPL was not distributed with this
8 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 * This file incorporates work covered by the following license notice:
12 * Licensed to the Apache Software Foundation (ASF) under one or more
13 * contributor license agreements. See the NOTICE file distributed
14 * with this work for additional information regarding copyright
15 * ownership. The ASF licenses this file to you under the Apache
16 * License, Version 2.0 (the "License"); you may not use this file
17 * except in compliance with the License. You may obtain a copy of
18 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
23 #include "parse/sqlbison_exports.hxx"
25 #include <connectivity/sqlnode.hxx>
26 #include <connectivity/sqlparse.hxx>
27 #include <internalnode.hxx>
28 #include <com/sun/star/lang/Locale.hpp>
29 #include <com/sun/star/sdbc/DataType.hpp>
30 #include <com/sun/star/util/Date.hpp>
31 #include <com/sun/star/util/DateTime.hpp>
32 #include <com/sun/star/util/Time.hpp>
33 #include <com/sun/star/util/XNumberFormatter.hpp>
34 #include <com/sun/star/util/XNumberFormatsSupplier.hpp>
35 #include <com/sun/star/util/XNumberFormats.hpp>
36 #include <com/sun/star/util/NumberFormat.hpp>
37 #include <com/sun/star/util/XNumberFormatTypes.hpp>
38 #include <com/sun/star/beans/XPropertySet.hpp>
39 #include <com/sun/star/i18n/KParseType.hpp>
40 #include <com/sun/star/i18n/KParseTokens.hpp>
42 #include "sqlscan.hxx"
43 #include <osl/diagnose.h>
44 #include "connectivity/dbconversion.hxx"
45 #include <rtl/ustrbuf.hxx>
46 #include <sal/macros.h>
48 #if defined __SUNPRO_CC
50 #elif defined _MSC_VER
51 #pragma warning(push, 1)
52 #pragma warning(disable:4273 4701 4706)
55 static ::rtl
::OUString aEmptyString
;
57 static connectivity
::OSQLInternalNode
* newNode
(const sal_Char
* pNewValue
,
58 const connectivity
::SQLNodeType eNodeType
,
59 const sal_uInt32 nNodeID
= 0)
61 return new connectivity
::OSQLInternalNode
(pNewValue
, eNodeType
, nNodeID
);
64 static connectivity
::OSQLInternalNode
* newNode
(const ::rtl
::OString
& _NewValue
,
65 const connectivity
::SQLNodeType eNodeType
,
66 const sal_uInt32 nNodeID
= 0)
68 return new connectivity
::OSQLInternalNode
(_NewValue
, eNodeType
, nNodeID
);
71 static connectivity
::OSQLInternalNode
* newNode
(const ::rtl
::OUString
& _NewValue
,
72 const connectivity
::SQLNodeType eNodeType
,
73 const sal_uInt32 nNodeID
= 0)
75 return new connectivity
::OSQLInternalNode
(_NewValue
, eNodeType
, nNodeID
);
79 // yyi ist die interne Nr. der Regel, die gerade reduziert wird.
80 // Ueber die Mapping-Tabelle yyrmap wird daraus eine externe Regel-Nr.
81 #define SQL_NEW_RULE newNode(aEmptyString, SQL_NODE_RULE, yyr1[yyn])
82 #define SQL_NEW_LISTRULE newNode(aEmptyString, SQL_NODE_LISTRULE, yyr1[yyn])
83 #define SQL_NEW_COMMALISTRULE newNode(aEmptyString, SQL_NODE_COMMALISTRULE, yyr1[yyn])
86 connectivity::OSQLParser
* xxx_pGLOBAL_SQLPARSER
;
88 #if !(defined MACOSX && defined PPC)
89 #define YYERROR_VERBOSE
92 #define SQLyyerror(s) \
94 xxx_pGLOBAL_SQLPARSER
->error(s
); \
97 using namespace connectivity
;
98 #define SQLyylex xxx_pGLOBAL_SQLPARSER->SQLlex
100 /* symbolic tokens */
103 connectivity
::OSQLParseNode
* pParseNode
;
105 %type
<pParseNode
> '(' ')' ',' ':' ';' '?' '[' ']' '{' '}' '.' 'K' 'M' 'G' 'T' 'P'
107 %token
<pParseNode
> SQL_TOKEN_STRING SQL_TOKEN_ACCESS_DATE SQL_TOKEN_INT SQL_TOKEN_REAL_NUM
108 %token
<pParseNode
> SQL_TOKEN_INTNUM SQL_TOKEN_APPROXNUM SQL_TOKEN_NOT SQL_TOKEN_NAME
111 %nonassoc
<pParseNode
> SQL_TOKEN_UMINUS
115 /* literal keyword tokens */
117 %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
119 %token
<pParseNode
> SQL_TOKEN_BETWEEN SQL_TOKEN_BIT SQL_TOKEN_BOTH SQL_TOKEN_BY
121 %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
122 %token
<pParseNode
> SQL_TOKEN_CURRENT SQL_TOKEN_CURSOR
124 %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
125 %token
<pParseNode
> SQL_TOKEN_DISTINCT SQL_TOKEN_DOUBLE SQL_TOKEN_DROP
127 %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
129 %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
131 %token
<pParseNode
> SQL_TOKEN_JOIN SQL_TOKEN_KEY SQL_TOKEN_LEADING SQL_TOKEN_LIKE SQL_TOKEN_LOCAL SQL_TOKEN_LOWER
132 %token
<pParseNode
> SQL_TOKEN_MAX SQL_TOKEN_MIN SQL_TOKEN_NATURAL SQL_TOKEN_NCHAR SQL_TOKEN_NULL SQL_TOKEN_NUMERIC
134 %token
<pParseNode
> SQL_TOKEN_OCTET_LENGTH SQL_TOKEN_OF SQL_TOKEN_ON SQL_TOKEN_OPTION SQL_TOKEN_ORDER SQL_TOKEN_OUTER
136 %token
<pParseNode
> SQL_TOKEN_PRECISION SQL_TOKEN_PRIMARY SQL_TOKEN_PRIVILEGES SQL_TOKEN_PROCEDURE SQL_TOKEN_PUBLIC
137 %token
<pParseNode
> SQL_TOKEN_REAL SQL_TOKEN_REFERENCES SQL_TOKEN_ROLLBACK
139 %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
141 %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
142 %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
143 %token
<pParseNode
> SQL_TOKEN_WHERE SQL_TOKEN_WITH SQL_TOKEN_WORK SQL_TOKEN_ZONE
146 %token
<pParseNode
> SQL_TOKEN_CALL SQL_TOKEN_D SQL_TOKEN_FN SQL_TOKEN_T SQL_TOKEN_TS SQL_TOKEN_OJ
147 /* string functions */
148 %token
<pParseNode
> SQL_TOKEN_ASCII SQL_TOKEN_BIT_LENGTH SQL_TOKEN_CHAR SQL_TOKEN_CHAR_LENGTH SQL_TOKEN_SQL_TOKEN_INTNUM
149 %token
<pParseNode
> SQL_TOKEN_CONCAT
150 %token
<pParseNode
> SQL_TOKEN_DIFFERENCE SQL_TOKEN_INSERT SQL_TOKEN_LCASE SQL_TOKEN_LEFT SQL_TOKEN_LENGTH SQL_TOKEN_LOCATE
151 %token
<pParseNode
> SQL_TOKEN_LOCATE_2 SQL_TOKEN_LTRIM SQL_TOKEN_POSITION SQL_TOKEN_REPEAT SQL_TOKEN_REPLACE
152 %token
<pParseNode
> SQL_TOKEN_RIGHT SQL_TOKEN_RTRIM SQL_TOKEN_SOUNDEX SQL_TOKEN_SPACE SQL_TOKEN_SUBSTRING SQL_TOKEN_UCASE
154 /* time and date functions */
155 %token
<pParseNode
> SQL_TOKEN_CURRENT_DATE SQL_TOKEN_CURRENT_TIME SQL_TOKEN_CURRENT_TIMESTAMP SQL_TOKEN_CURDATE SQL_TOKEN_CURTIME
156 %token
<pParseNode
> SQL_TOKEN_DAYNAME SQL_TOKEN_DAYOFMONTH SQL_TOKEN_DAYOFWEEK SQL_TOKEN_DAYOFYEAR SQL_TOKEN_EXTRACT
157 %token
<pParseNode
> SQL_TOKEN_HOUR SQL_TOKEN_MINUTE SQL_TOKEN_MONTH SQL_TOKEN_MONTHNAME SQL_TOKEN_NOW SQL_TOKEN_QUARTER SQL_TOKEN_DATEDIFF
158 %token
<pParseNode
> SQL_TOKEN_SECOND SQL_TOKEN_TIMESTAMPADD SQL_TOKEN_TIMESTAMPDIFF SQL_TOKEN_TIMEVALUE SQL_TOKEN_WEEK SQL_TOKEN_YEAR
160 /* numeric functions */
161 %token
<pParseNode
> SQL_TOKEN_ABS SQL_TOKEN_ACOS SQL_TOKEN_ASIN SQL_TOKEN_ATAN SQL_TOKEN_ATAN2 SQL_TOKEN_CEILING
162 %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
163 %token
<pParseNode
> SQL_TOKEN_LOG10 SQL_TOKEN_MOD SQL_TOKEN_PI SQL_TOKEN_POWER SQL_TOKEN_RADIANS SQL_TOKEN_RAND SQL_TOKEN_ROUNDMAGIC
164 %token
<pParseNode
> SQL_TOKEN_ROUND SQL_TOKEN_SIGN SQL_TOKEN_SIN SQL_TOKEN_SQRT SQL_TOKEN_TAN SQL_TOKEN_TRUNCATE
166 // computational operation
167 %token
<pParseNode
> SQL_TOKEN_EVERY SQL_TOKEN_INTERSECTION SQL_TOKEN_FUSION SQL_TOKEN_COLLECT SQL_TOKEN_VAR_POP SQL_TOKEN_VAR_SAMP
168 %token
<pParseNode
> SQL_TOKEN_STDDEV_SAMP SQL_TOKEN_STDDEV_POP
170 %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
171 %token
<pParseNode
> SQL_TOKEN_CASE SQL_TOKEN_THEN SQL_TOKEN_END SQL_TOKEN_NULLIF SQL_TOKEN_COALESCE SQL_TOKEN_WHEN SQL_TOKEN_ELSE
172 %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
173 %token
<pParseNode
> SQL_TOKEN_NEW SQL_TOKEN_OLD
174 %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
175 %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
176 %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
178 %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
179 %token
<pParseNode
> SQL_TOKEN_FIRST_VALUE SQL_TOKEN_LAST_VALUE SQL_TOKEN_NTH_VALUE SQL_TOKEN_FIRST SQL_TOKEN_LAST
180 %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
181 %token
<pParseNode
> SQL_TOKEN_PARTITION SQL_TOKEN_WINDOW SQL_TOKEN_NO
183 %token
<pParseNode
> SQL_TOKEN_LIMIT SQL_TOKEN_OFFSET SQL_TOKEN_NEXT SQL_TOKEN_ONLY
187 %left
<pParseNode
> SQL_TOKEN_OR
188 %left
<pParseNode
> SQL_TOKEN_AND
190 %left
<pParseNode
> SQL_LESSEQ SQL_GREATEQ SQL_NOTEQUAL SQL_LESS SQL_GREAT SQL_EQUAL
/* '<' '>' = <> < > <= >= != */
191 %left
<pParseNode
> '+' '-' SQL_CONCAT
192 %left
<pParseNode
> '*' '/'
193 %left SQL_TOKEN_NATURAL SQL_TOKEN_CROSS SQL_TOKEN_FULL SQL_TOKEN_LEFT SQL_TOKEN_RIGHT
200 %token
<pParseNode
> SQL_TOKEN_INVALIDSYMBOL
202 /*%type <pParseNode> sql_single_statement */
204 %type
<pParseNode
> sql
/*schema */
205 %type
<pParseNode
> column_def_opt_list column_def_opt table_constraint_def column_commalist
206 %type
<pParseNode
> view_def opt_with_check_option opt_column_commalist privilege_def
207 %type
<pParseNode
> opt_with_grant_option privileges operation_commalist operation
208 %type
<pParseNode
> grantee_commalist grantee opt_order_by_clause ordering_spec_commalist
209 %type
<pParseNode
> ordering_spec opt_asc_desc manipulative_statement commit_statement
210 %type
<pParseNode
> /*delete_statement_positioned*/ delete_statement_searched fetch_statement
211 %type
<pParseNode
> insert_statement values_or_query_spec
212 %type
<pParseNode
> rollback_statement select_statement_into opt_all_distinct
213 %type
<pParseNode
> /*update_statement_positioned*/ assignment_commalist assignment
214 %type
<pParseNode
> update_statement_searched target_commalist target opt_where_clause
215 %type
<pParseNode
> select_statement selection table_exp from_clause table_ref_commalist table_ref
216 %type
<pParseNode
> where_clause opt_group_by_clause column_ref_commalist opt_having_clause
217 %type
<pParseNode
> search_condition predicate comparison_predicate comparison_predicate_part_2 between_predicate between_predicate_part_2
218 %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
219 %type
<pParseNode
> all_or_any_predicate any_all_some existence_test subquery quantified_comparison_predicate_part_2
220 %type
<pParseNode
> scalar_exp_commalist parameter_ref literal parenthesized_boolean_value_expression
221 %type
<pParseNode
> column_ref data_type column cursor parameter range_variable user
/*like_check*/
222 /* neue Regeln bei OJ */
223 %type
<pParseNode
> derived_column as_clause table_name num_primary term num_value_exp
224 %type
<pParseNode
> value_exp_primary num_value_fct unsigned_value_spec cast_spec set_fct_spec scalar_subquery
225 %type
<pParseNode
> position_exp extract_exp length_exp general_value_spec
226 %type
<pParseNode
> general_set_fct set_fct_type query_exp non_join_query_exp joined_table
227 %type
<pParseNode
> non_join_query_term non_join_query_primary simple_table
228 %type
<pParseNode
> table_value_const_list row_value_constructor row_value_const_list row_value_constructor_elem
229 %type
<pParseNode
> qualified_join value_exp query_term join_type outer_join_type join_condition boolean_term
230 %type
<pParseNode
> boolean_factor truth_value boolean_test boolean_primary named_columns_join join_spec
231 %type
<pParseNode
> cast_operand cast_target factor datetime_value_exp
/*interval_value_exp*/ datetime_term datetime_factor
232 %type
<pParseNode
> datetime_primary datetime_value_fct time_zone time_zone_specifier
/*interval_term*/ interval_qualifier
233 %type
<pParseNode
> start_field non_second_datetime_field end_field single_datetime_field extract_field datetime_field time_zone_field
234 %type
<pParseNode
> extract_source char_length_exp octet_length_exp bit_length_exp select_sublist string_value_exp
235 %type
<pParseNode
> char_value_exp concatenation char_factor char_primary string_value_fct char_substring_fct fold
236 %type
<pParseNode
> form_conversion char_translation trim_fct trim_operands trim_spec bit_value_fct bit_substring_fct op_column_commalist
237 %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
238 %type
<pParseNode
> function_arg_commalist3 string_function_3Argument function_arg_commalist4 string_function_4Argument function_arg_commalist2 string_function_1Argument string_function_2Argument
239 %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
240 %type
<pParseNode
> all query_primary sql_not for_length upper_lower comparison column_val cross_union
/*opt_schema_element_list*/
241 %type
<pParseNode
> /*op_authorization op_schema*/ nil_fkt schema_element base_table_def base_table_element base_table_element_commalist
242 %type
<pParseNode
> column_def odbc_fct_spec odbc_call_spec odbc_fct_type op_parameter union_statement
243 %type
<pParseNode
> op_odbc_call_parameter odbc_parameter_commalist odbc_parameter function_args_commalist function_arg
244 %type
<pParseNode
> catalog_name schema_name table_node numeric_function string_function function_name date_function table_primary_as_range_column opt_as
245 %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
246 %type
<pParseNode
> case_expression else_clause result_expression result case_abbreviation case_specification searched_when_clause simple_when_clause searched_case simple_case
247 %type
<pParseNode
> when_operand_list when_operand case_operand
248 %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
249 %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
250 %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
251 %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
252 %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
253 %type
<pParseNode
> approximate_numeric_type exact_numeric_type opt_paren_precision_scale
254 /* window function rules */
255 %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
256 %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
257 %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
258 %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
259 %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
260 %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
261 %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
262 /* LIMIT and OFFSET */
263 %type
<pParseNode
> opt_limit_offset_clause limit_offset_clause opt_fetch_first_clause
266 /* Parse Tree an OSQLParser zurueckliefern
267 * (der Zugriff ueber yyval nach Aufruf des Parsers scheitert,
270 sql_single_statement:
272 { xxx_pGLOBAL_SQLPARSER
->setParseTree
( $1 ); }
274 { xxx_pGLOBAL_SQLPARSER
->setParseTree
( $1 ); }
277 /* schema definition language */
278 /* Note: other ``sql:sal_Unicode() rules appear later in the grammar */
281 manipulative_statement
293 | SQL_TOKEN_AUTHORIZATION user
303 | SQL_TOKEN_NAME '.' SQL_TOKEN_NAME
307 $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
313 SQL_TOKEN_CREATE SQL_TOKEN_SCHEMA op_schema op_authorization opt_schema_element_list
324 opt_schema_element_list:
326 | schema_glement_list
331 {$$ = SQL_NEW_LISTRULE;
333 | schema_element_list schema_element
347 SQL_TOKEN_CREATE SQL_TOKEN_TABLE table_node
'(' base_table_element_commalist
')'
352 $$
->append
($4 = newNode
("(", SQL_NODE_PUNCTUATION
));
354 $$
->append
($6 = newNode
(")", SQL_NODE_PUNCTUATION
));}
357 base_table_element_commalist:
359 {$$
= SQL_NEW_COMMALISTRULE
;
361 | base_table_element_commalist
',' base_table_element
368 | table_constraint_def
372 column data_type column_def_opt_list
381 /* empty */ {$$
= SQL_NEW_LISTRULE
;}
382 | column_def_opt_list column_def_opt
392 | SQL_TOKEN_PRIMARY SQL_TOKEN_KEY
400 SQL_TOKEN_NOT SQL_TOKEN_NULL
405 | SQL_TOKEN_DEFAULT literal
409 | SQL_TOKEN_DEFAULT SQL_TOKEN_NULL
413 | SQL_TOKEN_DEFAULT SQL_TOKEN_USER
417 | SQL_TOKEN_DEFAULT nil_fkt
424 | SQL_TOKEN_CHECK
'(' search_condition
')'
427 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
429 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));}
430 | SQL_TOKEN_REFERENCES table_node
434 | SQL_TOKEN_REFERENCES table_node
'(' column_commalist
')'
438 $$
->append
($3 = newNode
("(", SQL_NODE_PUNCTUATION
));
440 $$
->append
($5 = newNode
(")", SQL_NODE_PUNCTUATION
));}
443 table_constraint_def:
444 unique_spec
'(' column_commalist
')'
447 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
449 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));}
450 | SQL_TOKEN_FOREIGN SQL_TOKEN_KEY
'(' column_commalist
')' SQL_TOKEN_REFERENCES table_node
454 $$
->append
($3 = newNode
("(", SQL_NODE_PUNCTUATION
));
456 $$
->append
($5 = newNode
(")", SQL_NODE_PUNCTUATION
));
459 | SQL_TOKEN_FOREIGN SQL_TOKEN_KEY
'(' column_commalist
')' SQL_TOKEN_REFERENCES table_node
'(' column_commalist
')'
463 $$
->append
($3 = newNode
("(", SQL_NODE_PUNCTUATION
));
465 $$
->append
($5 = newNode
(")", SQL_NODE_PUNCTUATION
));
468 $$
->append
($8 = newNode
("(", SQL_NODE_PUNCTUATION
));
470 $$
->append
($10 = newNode
(")", SQL_NODE_PUNCTUATION
));}
471 | SQL_TOKEN_CHECK
'(' search_condition
')'
474 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
476 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));}
479 /* empty */ {$$
= SQL_NEW_RULE
;}
480 |
'(' column_commalist
')'
482 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
484 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
488 column_commalist
',' column
492 {$$
= SQL_NEW_COMMALISTRULE
;
497 SQL_TOKEN_CREATE SQL_TOKEN_VIEW table_node opt_column_commalist SQL_TOKEN_AS select_statement opt_with_check_option
508 opt_with_check_option:
509 /* empty */ {$$
= SQL_NEW_RULE
;}
510 | SQL_TOKEN_WITH SQL_TOKEN_CHECK SQL_TOKEN_OPTION
517 opt_column_commalist:
518 /* empty */ {$$
= SQL_NEW_RULE
;}
519 |
'(' column_commalist
')'
521 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
523 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));}
527 SQL_TOKEN_GRANT privileges SQL_TOKEN_ON table_node SQL_TOKEN_TO grantee_commalist
528 opt_with_grant_option
539 opt_with_grant_option:
540 /* empty */ {$$
= SQL_NEW_RULE
;}
541 | SQL_TOKEN_WITH SQL_TOKEN_GRANT SQL_TOKEN_OPTION
549 SQL_TOKEN_ALL SQL_TOKEN_PRIVILEGES
553 | operation_commalist
558 {$$
= SQL_NEW_COMMALISTRULE
;
560 | operation_commalist
',' operation
567 | SQL_TOKEN_INSERT opt_column_commalist
572 | SQL_TOKEN_UPDATE opt_column_commalist
576 | SQL_TOKEN_REFERENCES opt_column_commalist
586 {$$
= SQL_NEW_COMMALISTRULE
;
588 | grantee_commalist
',' grantee
598 /* module language */
601 /* empty */ {$$
= SQL_NEW_RULE
;}
602 | SQL_TOKEN_ORDER SQL_TOKEN_BY ordering_spec_commalist
609 ordering_spec_commalist:
611 {$$
= SQL_NEW_COMMALISTRULE
;
613 | ordering_spec_commalist
',' ordering_spec
619 /* SQL_TOKEN_INTNUM opt_asc_desc
624 predicate opt_asc_desc
629 | row_value_constructor_elem opt_asc_desc
643 manipulative_statement_list:
644 manipulative_statement
645 {$$ = SQL_NEW_LISTRULE;
647 | manipulative_statement_list manipulative_statement
658 /* manipulative statements */
660 manipulative_statement:
662 /* | delete_statement_positioned*/
663 | delete_statement_searched
667 | select_statement_into
668 /* | update_statement_positioned*/
669 | update_statement_searched
671 |
'{' odbc_call_spec
'}'
674 $$
->append
($1 = newNode
("{", SQL_NODE_PUNCTUATION
));
676 $$
->append
($3 = newNode
("}", SQL_NODE_PUNCTUATION
));
682 | union_statement SQL_TOKEN_UNION all select_statement
692 SQL_TOKEN_COMMIT SQL_TOKEN_WORK
698 delete_statement_positioned:
699 SQL_TOKEN_DELETE SQL_TOKEN_FROM table_node SQL_TOKEN_WHERE SQL_TOKEN_CURRENT SQL_TOKEN_OF cursor
710 delete_statement_searched:
711 SQL_TOKEN_DELETE SQL_TOKEN_FROM table_node opt_where_clause
720 SQL_TOKEN_FETCH cursor SQL_TOKEN_INTO target_commalist
729 SQL_TOKEN_INSERT SQL_TOKEN_INTO table_node opt_column_commalist query_exp
737 values_or_query_spec:
738 SQL_TOKEN_VALUES
'(' table_value_const_list
')'
741 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
743 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
747 table_value_const_list:
748 row_value_constructor
749 {$$
= SQL_NEW_COMMALISTRULE
;
751 | table_value_const_list
',' row_value_constructor
755 row_value_const_list:
756 row_value_constructor_elem
757 {$$
= SQL_NEW_COMMALISTRULE
;
759 | row_value_const_list
',' row_value_constructor_elem
763 row_value_constructor:
764 row_value_constructor_elem
765 /* | '(' row_value_const_list ')'
768 $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
770 $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
774 row_value_constructor_elem:
781 SQL_TOKEN_ROLLBACK SQL_TOKEN_WORK
788 /* INTO target_commalist herausgenommen */
789 select_statement_into:
790 SQL_TOKEN_SELECT opt_all_distinct selection SQL_TOKEN_INTO target_commalist table_exp
807 update_statement_positioned:
808 SQL_TOKEN_UPDATE table_node SQL_TOKEN_SET assignment_commalist
809 SQL_TOKEN_WHERE SQL_TOKEN_CURRENT SQL_TOKEN_OF cursor
821 assignment_commalist:
823 {$$
= SQL_NEW_COMMALISTRULE
;
825 | assignment_commalist
',' assignment
831 column SQL_EQUAL update_source
841 update_statement_searched:
842 SQL_TOKEN_UPDATE table_node SQL_TOKEN_SET assignment_commalist opt_where_clause
853 {$$
= SQL_NEW_COMMALISTRULE
;
855 | target_commalist
',' target
865 /* empty */ {$$
= SQL_NEW_RULE
;}
869 /* query expressions */
878 /* SELECT STATEMENT */
880 SQL_TOKEN_SELECT opt_all_distinct selection table_exp
894 $$
->append
($1 = newNode
("*", SQL_NODE_PUNCTUATION
));
896 | scalar_exp_commalist
898 opt_result_offset_clause:
899 /* empty */ {$$
= SQL_NEW_RULE
;}
900 | result_offset_clause
902 result_offset_clause:
903 SQL_TOKEN_OFFSET offset_row_count row_or_rows
911 opt_fetch_first_row_count:
912 /* empty */ {$$
= SQL_NEW_RULE
;}
913 | fetch_first_row_count
923 opt_fetch_first_clause:
924 /* empty */ {$$
= SQL_NEW_RULE
;}
928 SQL_TOKEN_FETCH first_or_next opt_fetch_first_row_count row_or_rows SQL_TOKEN_ONLY
941 fetch_first_row_count:
945 opt_limit_offset_clause:
946 /* empty */ {$$
= SQL_NEW_RULE
;}
947 | limit_offset_clause
950 /* empty */ {$$
= SQL_NEW_RULE
;}
951 | SQL_TOKEN_OFFSET SQL_TOKEN_INTNUM
959 SQL_TOKEN_LIMIT SQL_TOKEN_INTNUM opt_offset
968 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
984 SQL_TOKEN_FROM table_ref_commalist
993 { $$
= SQL_NEW_COMMALISTRULE
;
995 | table_ref_commalist
',' table_ref
1001 /* empty */ {$$
= SQL_NEW_RULE
;}
1005 /* empty */ {$$
= SQL_NEW_RULE
;}
1008 table_primary_as_range_column:
1009 {$$
= SQL_NEW_RULE
;}
1010 | opt_as SQL_TOKEN_NAME op_column_commalist
1019 table_node table_primary_as_range_column
1025 | subquery range_variable op_column_commalist
1033 |
'{' SQL_TOKEN_OJ joined_table
'}'
1036 $$
->append
($1 = newNode
("{", SQL_NODE_PUNCTUATION
));
1039 $$
->append
($4 = newNode
("}", SQL_NODE_PUNCTUATION
));
1041 |
'(' joined_table
')'
1044 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
1046 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
1050 SQL_TOKEN_WHERE search_condition
1056 opt_group_by_clause:
1057 /* empty */ {$$
= SQL_NEW_RULE
;}
1058 | SQL_TOKEN_GROUP SQL_TOKEN_BY column_ref_commalist
1065 column_ref_commalist:
1067 {$$
= SQL_NEW_COMMALISTRULE
;
1070 {$$
= SQL_NEW_COMMALISTRULE
;
1072 | column_ref_commalist
',' column_ref
1075 | column_ref_commalist
',' set_fct_spec
1081 /* empty */ {$$
= SQL_NEW_RULE
;}
1082 | SQL_TOKEN_HAVING search_condition
1088 /* search conditions */
1097 |
'(' search_condition
')'
1098 { // boolean_primary: rule 2
1100 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
1102 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
1104 | row_value_constructor_elem
/*[^')' ',']*/
1106 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
())// boolean_primary: rule 3
1109 sal_Int16 nErg
= xxx_pGLOBAL_SQLPARSER
->buildComparsionRule
($$
,$1);
1112 OSQLParseNode
* pTemp
= $$
;
1113 $$
= pTemp
->removeAt
((sal_uInt32
)0);
1129 parenthesized_boolean_value_expression:
1130 '(' search_condition
')'
1131 { // boolean_primary: rule 2
1133 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
1135 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
1140 | boolean_primary SQL_TOKEN_IS sql_not truth_value
1151 | SQL_TOKEN_NOT boolean_test
1152 { // boolean_factor: rule 1
1160 | boolean_term SQL_TOKEN_AND boolean_factor
1162 $$
= SQL_NEW_RULE
; // boolean_term: rule 1
1170 | search_condition SQL_TOKEN_OR boolean_term
1172 $$
= SQL_NEW_RULE
; // search_condition
1179 comparison_predicate
1181 | all_or_any_predicate
1188 comparison_predicate_part_2:
1189 comparison row_value_constructor
1191 $$
= SQL_NEW_RULE
; // comparison_predicate: rule 1
1195 comparison_predicate:
1196 row_value_constructor comparison row_value_constructor
1198 $$
= SQL_NEW_RULE
; // comparison_predicate: rule 1
1203 | comparison row_value_constructor
1205 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
()) // comparison_predicate: rule 2
1208 sal_Int16 nErg
= xxx_pGLOBAL_SQLPARSER
->buildPredicateRule
($$
,$2,$1);
1211 OSQLParseNode
* pTemp
= $$
;
1212 $$
= pTemp
->removeAt
((sal_uInt32
)0);
1234 | SQL_TOKEN_IS sql_not SQL_TOKEN_DISTINCT SQL_TOKEN_FROM
1242 | SQL_TOKEN_IS sql_not
1249 between_predicate_part_2:
1250 sql_not SQL_TOKEN_BETWEEN row_value_constructor SQL_TOKEN_AND row_value_constructor
1252 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
()) // between_predicate: rule 2
1256 sal_Int16 nErg
= xxx_pGLOBAL_SQLPARSER
->buildPredicateRule
($$
,$3,$2,$5);
1259 OSQLParseNode
* pTemp
= $$
;
1260 $$
= pTemp
->removeAt
((sal_uInt32
)0);
1261 OSQLParseNode
* pColumnRef
= $$
->removeAt
((sal_uInt32
)0);
1263 OSQLParseNode
* pBetween_predicate
= new OSQLInternalNode
(aEmptyString
, SQL_NODE_RULE
,OSQLParser
::RuleID
(OSQLParseNode
::between_predicate
));
1264 pBetween_predicate
->append
(pColumnRef
);
1265 pBetween_predicate
->append
($$
);
1266 $$
= pBetween_predicate
;
1279 $$
= SQL_NEW_RULE
; // between_predicate: rule 1
1288 row_value_constructor between_predicate_part_2
1290 $$
= SQL_NEW_RULE
; // between_predicate: rule 1
1294 | between_predicate_part_2
1296 character_like_predicate_part_2:
1297 sql_not SQL_TOKEN_LIKE string_value_exp opt_escape
1299 $$
= SQL_NEW_RULE
; // like_predicate: rule 1
1306 other_like_predicate_part_2:
1307 sql_not SQL_TOKEN_LIKE value_exp_primary opt_escape
1309 $$
= SQL_NEW_RULE
; // like_predicate: rule 1
1317 row_value_constructor character_like_predicate_part_2
1319 $$
= SQL_NEW_RULE
; // like_predicate: rule 1
1323 | row_value_constructor other_like_predicate_part_2
1325 $$
= SQL_NEW_RULE
; // like_predicate: rule 3
1329 | character_like_predicate_part_2
1331 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
()) // like_predicate: rule 5
1333 OSQLParseNode
* pColumnRef
= newNode
(aEmptyString
, SQL_NODE_RULE
,OSQLParser
::RuleID
(OSQLParseNode
::column_ref
));
1334 pColumnRef
->append
(newNode
(xxx_pGLOBAL_SQLPARSER
->getFieldName
(),SQL_NODE_NAME
));
1337 $$
->append
(pColumnRef
);
1339 OSQLParseNode
* p2nd
= $1->removeAt
(2);
1340 OSQLParseNode
* p3rd
= $1->removeAt
(2);
1341 if
( !xxx_pGLOBAL_SQLPARSER
->buildLikeRule
($1,p2nd
,p3rd
) )
1351 | other_like_predicate_part_2
1353 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
()) // like_predicate: rule 6
1355 OSQLParseNode
* pColumnRef
= newNode
(aEmptyString
, SQL_NODE_RULE
,OSQLParser
::RuleID
(OSQLParseNode
::column_ref
));
1356 pColumnRef
->append
(newNode
(xxx_pGLOBAL_SQLPARSER
->getFieldName
(),SQL_NODE_NAME
));
1359 $$
->append
(pColumnRef
);
1361 OSQLParseNode
* p2nd
= $1->removeAt
(2);
1362 OSQLParseNode
* p3rd
= $1->removeAt
(2);
1363 if
( !xxx_pGLOBAL_SQLPARSER
->buildLikeRule
($1,p2nd
,p3rd
) )
1376 /* empty */ {$$
= SQL_NEW_RULE
;}
1377 | SQL_TOKEN_ESCAPE string_value_exp
1381 |
'{' SQL_TOKEN_ESCAPE SQL_TOKEN_STRING
'}'
1384 $$
->append
($1 = newNode
("{", SQL_NODE_PUNCTUATION
));
1387 $$
->append
($4 = newNode
("}", SQL_NODE_PUNCTUATION
));
1391 null_predicate_part_2:
1392 SQL_TOKEN_IS sql_not SQL_TOKEN_NULL
1394 $$
= SQL_NEW_RULE
; // test_for_null: rule 1
1401 row_value_constructor null_predicate_part_2
1403 $$
= SQL_NEW_RULE
; // test_for_null: rule 1
1407 | null_predicate_part_2
1409 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
())// test_for_null: rule 2
1411 OSQLParseNode
* pColumnRef
= newNode
(aEmptyString
, SQL_NODE_RULE
,OSQLParser
::RuleID
(OSQLParseNode
::column_ref
));
1412 pColumnRef
->append
(newNode
(xxx_pGLOBAL_SQLPARSER
->getFieldName
(),SQL_NODE_NAME
));
1415 $$
->append
(pColumnRef
);
1427 |
'(' value_exp_commalist
')'
1429 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
1431 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
1434 in_predicate_part_2:
1435 sql_not SQL_TOKEN_IN in_predicate_value
1437 $$
= SQL_NEW_RULE
;// in_predicate: rule 1
1444 row_value_constructor in_predicate_part_2
1446 $$
= SQL_NEW_RULE
;// in_predicate: rule 1
1450 | in_predicate_part_2
1452 if
( xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
() )// in_predicate: rule 2
1454 OSQLParseNode
* pColumnRef
= newNode
(aEmptyString
, SQL_NODE_RULE
,OSQLParser
::RuleID
(OSQLParseNode
::column_ref
));
1455 pColumnRef
->append
(newNode
(xxx_pGLOBAL_SQLPARSER
->getFieldName
(),SQL_NODE_NAME
));
1458 $$
->append
(pColumnRef
);
1465 quantified_comparison_predicate_part_2:
1466 comparison any_all_some subquery
1474 all_or_any_predicate:
1475 row_value_constructor quantified_comparison_predicate_part_2
1481 | quantified_comparison_predicate_part_2
1483 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
())
1485 OSQLParseNode
* pColumnRef
= newNode
(aEmptyString
, SQL_NODE_RULE
,OSQLParser
::RuleID
(OSQLParseNode
::column_ref
));
1486 pColumnRef
->append
(newNode
(xxx_pGLOBAL_SQLPARSER
->getFieldName
(),SQL_NODE_NAME
));
1489 $$
->append
(pColumnRef
);
1504 SQL_TOKEN_EXISTS subquery
1510 SQL_TOKEN_UNIQUE subquery
1518 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
1520 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));}
1523 /* scalar expressions */
1524 scalar_exp_commalist:
1527 $$
= SQL_NEW_COMMALISTRULE
;
1530 | scalar_exp_commalist
',' select_sublist
1537 /* table_node '.' '*'
1541 $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
1542 $$->append($3 = newNode("*", SQL_NODE_PUNCTUATION));
1557 $$ = newNode("*", SQL_NODE_PUNCTUATION);
1561 $$ = newNode("?", SQL_NODE_PUNCTUATION);
1567 $$->append($2 = newNode("*", SQL_NODE_PUNCTUATION));
1568 xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_False);
1574 $$->append($2 = newNode("?", SQL_NODE_PUNCTUATION));
1575 xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_False);
1583 | SQL_TOKEN_REAL_NUM
1585 | SQL_TOKEN_APPROXNUM
1586 | SQL_TOKEN_ACCESS_DATE
1587 /* rules for predicate check */
1588 | literal SQL_TOKEN_STRING
1590 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
())
1595 xxx_pGLOBAL_SQLPARSER
->reduceLiteral
($$
, sal_True
);
1600 | literal SQL_TOKEN_INT
1602 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
())
1607 xxx_pGLOBAL_SQLPARSER
->reduceLiteral
($$
, sal_True
);
1612 | literal SQL_TOKEN_REAL_NUM
1614 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
())
1619 xxx_pGLOBAL_SQLPARSER
->reduceLiteral
($$
, sal_True
);
1624 | literal SQL_TOKEN_APPROXNUM
1626 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
())
1631 xxx_pGLOBAL_SQLPARSER
->reduceLiteral
($$
, sal_True
);
1640 /* empty */ {$$
= SQL_NEW_RULE
;}
1641 | SQL_TOKEN_AS column
1650 SQL_TOKEN_POSITION
'(' value_exp SQL_TOKEN_IN value_exp
')'
1654 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1658 $$
->append
($6 = newNode
(")", SQL_NODE_PUNCTUATION
));
1660 | SQL_TOKEN_POSITION
'(' value_exp_commalist
')'
1664 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1666 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
1675 SQL_TOKEN_CHAR_LENGTH
'(' value_exp
')'
1679 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1681 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
1683 | SQL_TOKEN_SQL_TOKEN_INTNUM
'(' value_exp
')'
1687 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1689 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
1694 SQL_TOKEN_OCTET_LENGTH
'(' value_exp
')'
1698 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1700 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
1704 SQL_TOKEN_BIT_LENGTH
'(' value_exp
')'
1708 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1710 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
1731 non_second_datetime_field
1748 SQL_TOKEN_TIMEZONE_HOUR
1753 | SQL_TOKEN_TIMEZONE_MINUTE
1765 /* | interval_value_exp
1772 SQL_TOKEN_EXTRACT
'(' extract_field SQL_TOKEN_FROM value_exp
')'
1776 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1780 $$
->append
($6 = newNode
(")", SQL_NODE_PUNCTUATION
));
1783 unsigned_value_spec:
1794 | SQL_TOKEN_CURRENT_CATALOG
1795 | SQL_TOKEN_CURRENT_DEFAULT_TRANSFORM_GROUP
1796 | SQL_TOKEN_CURRENT_PATH
1797 | SQL_TOKEN_CURRENT_ROLE
1798 | SQL_TOKEN_CURRENT_SCHEMA
1799 | SQL_TOKEN_CURRENT_USER
1800 | SQL_TOKEN_SESSION_USER
1801 | SQL_TOKEN_SYSTEM_USER
1805 |
'{' odbc_fct_spec
'}'
1808 $$
->append
($1 = newNode
("{", SQL_NODE_PUNCTUATION
));
1810 $$
->append
($3 = newNode
("}", SQL_NODE_PUNCTUATION
));
1812 | function_name
'(' ')'
1816 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1817 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
1819 | function_name0
'(' ')'
1823 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1824 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
1826 | function_name1
'(' function_arg
')'
1830 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1832 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
1834 | function_name2
'(' function_arg_commalist2
')'
1838 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1840 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
1842 | function_name3
'(' function_arg_commalist3
')'
1846 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1848 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
1850 | string_function_4Argument
'(' function_arg_commalist4
')'
1854 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1856 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
1858 | function_name
'(' function_args_commalist
')'
1862 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1864 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
1866 | function_name12
'(' function_args_commalist
')'
1868 if
( $3->count
() == 1 ||
$3->count
() == 2 )
1872 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1874 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
1879 | function_name23
'(' function_args_commalist
')'
1881 if
( $3->count
() == 2 ||
$3->count
() == 3)
1885 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
1887 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
1894 date_function_0Argument
1895 | numeric_function_0Argument
1898 string_function_1Argument
1899 | date_function_1Argument
1900 | numeric_function_1Argument
1903 string_function_2Argument
1904 | numeric_function_2Argument
1914 | SQL_TOKEN_DATEDIFF
1917 string_function_3Argument
1925 string_function_1Argument:
1935 string_function_2Argument:
1940 string_function_3Argument:
1943 string_function_4Argument:
1950 | SQL_TOKEN_DIFFERENCE
1951 | SQL_TOKEN_LOCATE_2
1954 date_function_0Argument:
1959 date_function_1Argument:
1961 | SQL_TOKEN_DAYOFMONTH
1962 | SQL_TOKEN_DAYOFYEAR
1965 | SQL_TOKEN_MONTHNAME
1972 | SQL_TOKEN_TIMEVALUE
1973 | SQL_TOKEN_DATEVALUE
1977 SQL_TOKEN_TIMESTAMPADD
1978 | SQL_TOKEN_TIMESTAMPDIFF
1980 numeric_function_0Argument:
1983 numeric_function_1Argument:
2001 | SQL_TOKEN_ROUNDMAGIC
2003 numeric_function_2Argument:
2010 | SQL_TOKEN_TRUNCATE
2014 window_function_type SQL_TOKEN_OVER window_name_or_specification
2022 window_function_type
:
2023 rank_function_type
'(' ')'
2027 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2028 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
2030 | SQL_TOKEN_ROW_NUMBER
'(' ')'
2034 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2035 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
2039 | lead_or_lag_function
2040 | first_or_last_value_function
2041 | nth_value_function
2044 SQL_TOKEN_NTILE
'(' number_of_tiles
')'
2048 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2050 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
2053 dynamic_parameter_specification:
2056 simple_value_specification:
2060 simple_value_specification
2061 | dynamic_parameter_specification
2063 opt_lead_or_lag_function:
2064 /* empty */ {$$
= SQL_NEW_RULE
;}
2068 $$
->append
($1 = newNode
(",", SQL_NODE_PUNCTUATION
));
2071 |
',' offset
',' default_expression
2074 $$
->append
($1 = newNode
(",", SQL_NODE_PUNCTUATION
));
2076 $$
->append
($3 = newNode
(",", SQL_NODE_PUNCTUATION
));
2081 /* empty */ {$$
= SQL_NEW_RULE
;}
2085 lead_or_lag_function:
2086 lead_or_lag
'(' lead_or_lag_extent opt_lead_or_lag_function
')' opt_null_treatment
2090 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2093 $$
->append
($5 = newNode
(")", SQL_NODE_PUNCTUATION
));
2111 SQL_TOKEN_RESPECT SQL_TOKEN_NULLS
2112 | SQL_TOKEN_IGNORE SQL_TOKEN_NULLS
2114 first_or_last_value_function:
2115 first_or_last_value
'(' value_exp
')' opt_null_treatment
2119 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2121 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
2125 first_or_last_value
:
2126 SQL_TOKEN_FIRST_VALUE
2127 | SQL_TOKEN_LAST_VALUE
2129 opt_from_first_or_last:
2130 /* empty */ {$$
= SQL_NEW_RULE
;}
2131 | from_first_or_last
2134 SQL_TOKEN_NTH_VALUE
'(' value_exp
',' nth_row
')' opt_from_first_or_last opt_null_treatment
2138 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2140 $$
->append
($4 = newNode
(",", SQL_NODE_PUNCTUATION
));
2142 $$
->append
($6 = newNode
(")", SQL_NODE_PUNCTUATION
));
2148 simple_value_specification
2149 | dynamic_parameter_specification
2152 SQL_TOKEN_FROM SQL_TOKEN_FIRST
2158 | SQL_TOKEN_FROM SQL_TOKEN_LAST
2168 window_name_or_specification:
2170 | in_line_window_specification
2172 in_line_window_specification:
2173 window_specification
2176 /* empty */ {$$
= SQL_NEW_RULE
;}
2180 SQL_TOKEN_WINDOW window_definition_list
2187 window_definition_list:
2188 window_definition_list
',' window_definition
2192 {$$
= SQL_NEW_COMMALISTRULE
;
2196 new_window_name SQL_TOKEN_AS window_specification
2207 window_specification:
2208 '(' window_specification_details
')'
2211 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
2213 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
2216 opt_existing_window_name:
2217 /* empty */ {$$
= SQL_NEW_RULE
;}
2218 | existing_window_name
2220 opt_window_partition_clause:
2221 /* empty */ {$$
= SQL_NEW_RULE
;}
2222 | window_partition_clause
2224 opt_window_frame_clause:
2225 /* empty */ {$$
= SQL_NEW_RULE
;}
2226 | window_frame_clause
2228 window_specification_details:
2229 opt_existing_window_name
2230 opt_window_partition_clause
2232 opt_window_frame_clause
2234 existing_window_name:
2237 window_partition_clause:
2238 SQL_TOKEN_PARTITION SQL_TOKEN_BY window_partition_column_reference_list
2246 window_partition_column_reference_list:
2247 window_partition_column_reference_list
',' window_partition_column_reference
2250 | window_partition_column_reference
2251 {$$
= SQL_NEW_COMMALISTRULE
;
2254 window_partition_column_reference:
2255 column_ref opt_collate_clause
2262 opt_window_frame_exclusion:
2263 /* empty */ {$$
= SQL_NEW_RULE
;}
2264 | window_frame_exclusion
2266 window_frame_clause:
2267 window_frame_units window_frame_extent opt_window_frame_exclusion
2279 window_frame_extent:
2281 | window_frame_between
2284 SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING
2290 | window_frame_preceding
2291 | SQL_TOKEN_CURRENT SQL_TOKEN_ROW
2298 window_frame_preceding:
2299 unsigned_value_spec SQL_TOKEN_PRECEDING
2306 window_frame_between:
2307 SQL_TOKEN_BETWEEN window_frame_bound_1 SQL_TOKEN_AND window_frame_bound_2
2316 window_frame_bound_1:
2319 window_frame_bound_2:
2324 | SQL_TOKEN_UNBOUNDED SQL_TOKEN_FOLLOWING
2330 | window_frame_following
2332 window_frame_following:
2333 unsigned_value_spec SQL_TOKEN_FOLLOWING
2340 window_frame_exclusion:
2341 SQL_TOKEN_EXCLUDE SQL_TOKEN_CURRENT SQL_TOKEN_ROW
2348 | SQL_TOKEN_EXCLUDE SQL_TOKEN_GROUP
2354 | SQL_TOKEN_EXCLUDE SQL_TOKEN_TIES
2360 | SQL_TOKEN_EXCLUDE SQL_TOKEN_NO SQL_TOKEN_OTHERS
2369 {$$
= SQL_NEW_RULE
;}
2373 $$
->append
($1 = newNode
("?", SQL_NODE_PUNCTUATION
));
2378 op_parameter SQL_TOKEN_CALL table_node op_odbc_call_parameter
2388 op_odbc_call_parameter:
2389 {$$
= SQL_NEW_RULE
;}
2390 |
'(' odbc_parameter_commalist
')'
2393 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
2395 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
2399 odbc_parameter_commalist:
2401 {$$
= SQL_NEW_COMMALISTRULE
;
2403 | odbc_parameter_commalist
',' odbc_parameter
2410 /* empty */ {$$
= SQL_NEW_RULE
;}
2416 odbc_fct_type SQL_TOKEN_STRING
2422 | SQL_TOKEN_FN set_fct_spec
2437 set_fct_type
'(' opt_all_distinct function_arg
')'
2441 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2444 $$
->append
($5 = newNode
(")", SQL_NODE_PUNCTUATION
));
2446 | SQL_TOKEN_COUNT
'(' '*' ')'
2450 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2451 $$
->append
($3 = newNode
("*", SQL_NODE_PUNCTUATION
));
2452 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
2454 | SQL_TOKEN_COUNT
'(' opt_all_distinct function_arg
')'
2458 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2461 $$
->append
($5 = newNode
(")", SQL_NODE_PUNCTUATION
));
2463 | ordered_set_function
2464 | array_aggregate_function
2474 | SQL_TOKEN_STDDEV_POP
2475 | SQL_TOKEN_STDDEV_SAMP
2476 | SQL_TOKEN_VAR_SAMP
2480 | SQL_TOKEN_INTERSECTION
2483 ordered_set_function:
2484 hypothetical_set_function
2485 | inverse_distribution_function
2487 hypothetical_set_function:
2488 rank_function_type
'(' hypothetical_set_function_value_expression_list
')' within_group_specification
2492 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2494 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
2497 | rank_function_type
'(' hypothetical_set_function_value_expression_list SQL_TOKEN_BY value_exp_commalist
')' within_group_specification
2501 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2505 $$
->append
($6 = newNode
(")", SQL_NODE_PUNCTUATION
));
2510 within_group_specification:
2514 | SQL_TOKEN_WITHIN SQL_TOKEN_GROUP
'(' opt_order_by_clause
')'
2519 $$
->append
($3 = newNode
("(", SQL_NODE_PUNCTUATION
));
2521 $$
->append
($5 = newNode
(")", SQL_NODE_PUNCTUATION
));
2524 hypothetical_set_function_value_expression_list:
2528 inverse_distribution_function:
2529 inverse_distribution_function_type
'('inverse_distribution_function_argument
')' within_group_specification
2533 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2535 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
2538 inverse_distribution_function_argument:
2541 inverse_distribution_function_type:
2542 SQL_TOKEN_PERCENTILE_CONT
2543 | SQL_TOKEN_PERCENTILE_DISC
2546 array_aggregate_function:
2547 SQL_TOKEN_ARRAY_AGG
'(' value_exp opt_order_by_clause
')'
2551 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2554 $$
->append
($5 = newNode
(")", SQL_NODE_PUNCTUATION
));
2560 | SQL_TOKEN_DENSE_RANK
2561 | SQL_TOKEN_PERCENT_RANK
2562 | SQL_TOKEN_CUME_DIST
2565 SQL_TOKEN_LEFT %prec SQL_TOKEN_LEFT
2570 | SQL_TOKEN_RIGHT %prec SQL_TOKEN_RIGHT
2575 | SQL_TOKEN_FULL %prec SQL_TOKEN_FULL
2582 SQL_TOKEN_ON search_condition
2591 | named_columns_join
2594 /* empty */ {$$
= SQL_NEW_RULE
;}
2601 | outer_join_type SQL_TOKEN_OUTER
2609 table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref
2620 /* wenn SQL_TOKEN_NATURAL, dann keine join_spec */
2621 table_ref SQL_TOKEN_NATURAL join_type SQL_TOKEN_JOIN table_ref
2630 | table_ref join_type SQL_TOKEN_JOIN table_ref join_spec
2645 SQL_TOKEN_USING
'(' column_commalist
')'
2649 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2651 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
2656 | values_or_query_spec
2659 non_join_query_primary:
2661 |
'(' non_join_query_exp
')'
2664 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
2666 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
2669 non_join_query_term:
2670 non_join_query_primary
2671 | query_term SQL_TOKEN_INTERSECT all query_primary
2681 non_join_query_primary
2685 | query_exp SQL_TOKEN_UNION all query_term
2693 | query_exp SQL_TOKEN_EXCEPT all query_term
2703 /* empty*/ {$$
= SQL_NEW_RULE
;}
2707 non_join_query_exp
/*[^')']*/
2720 SQL_TOKEN_CAST
'(' cast_operand SQL_TOKEN_AS cast_target
')'
2724 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
2728 $$
->append
($6 = newNode
(")", SQL_NODE_PUNCTUATION
));
2741 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
2743 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
2754 |
'-' num_primary %prec SQL_TOKEN_UMINUS
2757 $$
->append
($1 = newNode
("-", SQL_NODE_PUNCTUATION
));
2760 |
'+' num_primary %prec SQL_TOKEN_UMINUS
2763 $$
->append
($1 = newNode
("+", SQL_NODE_PUNCTUATION
));
2774 $$
->append
($2 = newNode
("*", SQL_NODE_PUNCTUATION
));
2781 $$
->append
($2 = newNode
("/", SQL_NODE_PUNCTUATION
));
2788 | num_value_exp
'+' term
2792 $$
->append
($2 = newNode
("+", SQL_NODE_PUNCTUATION
));
2795 | num_value_exp
'-' term
2799 $$
->append
($2 = newNode
("-", SQL_NODE_PUNCTUATION
));
2804 /* value_exp_primary
2809 |*/ datetime_value_fct
2816 SQL_TOKEN_CURRENT_DATE
2821 | SQL_TOKEN_CURRENT_TIME
2826 | SQL_TOKEN_CURRENT_TIMESTAMP
2833 SQL_TOKEN_AT time_zone_specifier
2840 time_zone_specifier:
2846 /* | SQL_TOKEN_TIME SQL_TOKEN_ZONE interval_value_exp
2860 | datetime_primary time_zone
2877 | interval_term '*' factor
2881 $$->append($2 = newNode("*", SQL_NODE_PUNCTUATION));
2884 | interval_term '/' factor
2888 $$->append($2 = newNode("/", SQL_NODE_PUNCTUATION));
2899 /* | interval_value_exp '+' datetime_term
2903 $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
2906 | datetime_value_exp '+' interval_term
2910 $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
2913 | datetime_value_exp '-' interval_term
2917 $$->append($2 = newNode("-", SQL_NODE_PUNCTUATION));
2928 | interval_value_exp '+' interval_term
2932 $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
2935 | interval_value_exp '-' interval_term
2939 $$->append($2 = newNode("-", SQL_NODE_PUNCTUATION));
2942 | '(' datetime_value_exp '-' datetime_term ')' interval_qualifier
2945 $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
2947 $$->append($3 = newNode("-", SQL_NODE_PUNCTUATION));
2949 $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
2954 non_second_datetime_field:
2962 non_second_datetime_field opt_paren_precision
2970 non_second_datetime_field
2971 | SQL_TOKEN_SECOND opt_paren_precision
2979 single_datetime_field:
2980 non_second_datetime_field opt_paren_precision
2986 | SQL_TOKEN_SECOND opt_paren_precision_scale
2995 start_field SQL_TOKEN_TO end_field
3002 | single_datetime_field
3005 function_arg_commalist2:
3006 function_arg
',' function_arg
3007 {$$
= SQL_NEW_COMMALISTRULE
;
3011 function_arg_commalist3:
3012 function_arg
',' function_arg
',' function_arg
3014 $$
= SQL_NEW_COMMALISTRULE
;
3020 function_arg_commalist4:
3021 function_arg
',' function_arg
',' function_arg
',' function_arg
3023 $$
= SQL_NEW_COMMALISTRULE
;
3030 value_exp_commalist:
3032 {$$
= SQL_NEW_COMMALISTRULE
;
3034 | value_exp_commalist
',' value_exp
3037 /* this rule is only valid if we check predicates */
3038 | value_exp_commalist
';' value_exp
3040 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
())
3051 | value_exp comparison value_exp
3058 | value_exp SQL_TOKEN_USING value_exp comparison value_exp
3066 | value_exp SQL_TOKEN_BY value_exp_commalist
3074 function_args_commalist:
3076 {$$
= SQL_NEW_COMMALISTRULE
;
3078 | function_args_commalist
',' function_arg
3081 /* this rule is only valid if we check predicates */
3082 | function_args_commalist
';' function_arg
3084 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
())
3095 num_value_exp
/*[^')']*/
3097 | datetime_value_exp
3116 char_value_exp
'+' char_factor
3120 $$
->append
($2 = newNode
("+", SQL_NODE_PUNCTUATION
));
3123 | value_exp SQL_CONCAT value_exp
3137 SQL_TOKEN_COLLATE table_node
3146 | char_primary collate_clause
3165 SQL_TOKEN_SUBSTRING
'(' bit_value_exp SQL_TOKEN_FROM string_value_exp for_length
')'
3169 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
3174 $$
->append
($7 = newNode
(")", SQL_NODE_PUNCTUATION
));
3192 bit_value_exp '+' bit_factor
3196 $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
3209 {$$
= SQL_NEW_RULE
;}
3210 /* value_exp_primary
3241 {$$
= SQL_NEW_RULE
;}
3242 | SQL_TOKEN_FOR value_exp
3250 SQL_TOKEN_SUBSTRING
'(' value_exp SQL_TOKEN_FROM value_exp for_length
')'
3254 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
3259 $$
->append
($7 = newNode
(")", SQL_NODE_PUNCTUATION
));
3261 | SQL_TOKEN_SUBSTRING
'(' value_exp_commalist
')'
3265 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
3267 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
3275 upper_lower
'(' value_exp
')'
3279 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
3281 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
3285 SQL_TOKEN_CONVERT
'(' string_value_exp SQL_TOKEN_USING table_node
')'
3289 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
3293 $$
->append
($6 = newNode
(")", SQL_NODE_PUNCTUATION
));
3295 | SQL_TOKEN_CONVERT
'(' cast_operand
',' cast_target
')'
3299 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
3301 $$
->append
($2 = newNode
(",", SQL_NODE_PUNCTUATION
));
3303 $$
->append
($6 = newNode
(")", SQL_NODE_PUNCTUATION
));
3307 SQL_TOKEN_TRANSLATE
'(' string_value_exp SQL_TOKEN_USING table_node
')'
3311 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
3315 $$
->append
($6 = newNode
(")", SQL_NODE_PUNCTUATION
));
3319 SQL_TOKEN_TRIM
'(' trim_operands
')'
3323 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
3325 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
3329 trim_spec value_exp SQL_TOKEN_FROM value_exp
3337 | trim_spec SQL_TOKEN_FROM value_exp
3344 | value_exp SQL_TOKEN_FROM value_exp
3351 | SQL_TOKEN_FROM value_exp
3363 | SQL_TOKEN_TRAILING
3381 SQL_TOKEN_NAME
'.' schema_name
3385 $$
->append
($2 = newNode
(".", SQL_NODE_PUNCTUATION
));
3388 | SQL_TOKEN_NAME
':' schema_name
3392 $$
->append
($2 = newNode
(":", SQL_NODE_PUNCTUATION
));
3397 SQL_TOKEN_NAME
'.' table_name
3401 $$
->append
($2 = newNode
(".", SQL_NODE_PUNCTUATION
));
3416 /* | table_node '.' column_val %prec '.'
3419 $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
3422 | SQL_TOKEN_NAME
'.' column_val %prec
'.'
3425 $$
->append
($2 = newNode
(".", SQL_NODE_PUNCTUATION
));
3428 | SQL_TOKEN_NAME
'.' SQL_TOKEN_NAME
'.' column_val %prec
'.'
3431 $$
->append
($2 = newNode
(".", SQL_NODE_PUNCTUATION
));
3433 $$
->append
($4 = newNode
(".", SQL_NODE_PUNCTUATION
));
3435 | SQL_TOKEN_NAME
'.' SQL_TOKEN_NAME
'.' SQL_TOKEN_NAME
'.' column_val %prec
'.'
3438 $$
->append
($2= newNode
(".", SQL_NODE_PUNCTUATION
));
3440 $$
->append
($4 = newNode
(".", SQL_NODE_PUNCTUATION
));
3442 $$
->append
($6 = newNode
(".", SQL_NODE_PUNCTUATION
));
3445 | SQL_TOKEN_NAME
':' SQL_TOKEN_NAME
'.' SQL_TOKEN_NAME
'.' column_val %prec
'.'
3448 $$
->append
($2= newNode
(":", SQL_NODE_PUNCTUATION
));
3450 $$
->append
($4 = newNode
(".", SQL_NODE_PUNCTUATION
));
3452 $$
->append
($6 = newNode
(".", SQL_NODE_PUNCTUATION
));
3455 /* | SQL_TOKEN_NAME ';' SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val
3458 $$->append($2= newNode(";", SQL_NODE_PUNCTUATION));
3460 $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION));
3462 $$->append($6 = newNode(".", SQL_NODE_PUNCTUATION));
3475 $$
->append
($1 = newNode
("*", SQL_NODE_PUNCTUATION
));
3482 {$$
= SQL_NEW_RULE
;}
3483 | SQL_TOKEN_CHARACTER SQL_TOKEN_SET SQL_TOKEN_NAME
3492 {$$
= SQL_NEW_RULE
;}
3496 character_string_type opt_char_set_spec opt_collate_clause
3503 | national_character_string_type opt_collate_clause
3509 | binary_string_type
3515 character_string_type:
3516 SQL_TOKEN_CHARACTER opt_paren_precision
3522 | SQL_TOKEN_CHAR opt_paren_precision
3528 | SQL_TOKEN_CHARACTER SQL_TOKEN_VARYING paren_char_length
3535 | SQL_TOKEN_CHAR SQL_TOKEN_VARYING paren_char_length
3542 | SQL_TOKEN_VARCHAR paren_char_length
3548 | character_large_object_type
3550 opt_paren_precision:
3551 {$$
= SQL_NEW_RULE
;}
3555 '(' SQL_TOKEN_INTNUM
')'
3558 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
3560 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
3563 opt_paren_char_large_length:
3564 {$$
= SQL_NEW_RULE
;}
3565 | paren_character_large_object_length
3567 paren_character_large_object_length:
3568 '(' large_object_length
')'
3571 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
3573 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
3577 large_object_length:
3578 SQL_TOKEN_INTNUM opt_multiplier
3586 {$$
= SQL_NEW_RULE
;}
3590 $$
->append
($1 = newNode
("K", SQL_NODE_PUNCTUATION
));
3595 $$
->append
($1 = newNode
("M", SQL_NODE_PUNCTUATION
));
3600 $$
->append
($1 = newNode
("G", SQL_NODE_PUNCTUATION
));
3605 $$
->append
($1 = newNode
("T", SQL_NODE_PUNCTUATION
));
3610 $$
->append
($1 = newNode
("P", SQL_NODE_PUNCTUATION
));
3613 character_large_object_type:
3614 SQL_TOKEN_CHARACTER SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
3622 | SQL_TOKEN_CHAR SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
3630 | SQL_TOKEN_CLOB opt_paren_char_large_length
3637 national_character_string_type:
3638 SQL_TOKEN_NATIONAL SQL_TOKEN_CHARACTER opt_paren_precision
3645 | SQL_TOKEN_NATIONAL SQL_TOKEN_CHAR opt_paren_precision
3652 | SQL_TOKEN_NCHAR opt_paren_precision
3658 | SQL_TOKEN_NATIONAL SQL_TOKEN_CHARACTER SQL_TOKEN_VARYING paren_char_length
3666 | SQL_TOKEN_NATIONAL SQL_TOKEN_CHAR SQL_TOKEN_VARYING paren_char_length
3674 | SQL_TOKEN_NCHAR SQL_TOKEN_VARYING paren_char_length
3681 | national_character_large_object_type
3683 national_character_large_object_type:
3684 SQL_TOKEN_NATIONAL SQL_TOKEN_CHARACTER SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
3693 | SQL_TOKEN_NCHAR SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
3701 | SQL_TOKEN_NCLOB opt_paren_char_large_length
3709 SQL_TOKEN_BINARY opt_paren_precision
3715 | SQL_TOKEN_BINARY SQL_TOKEN_VARYING paren_char_length
3722 | SQL_TOKEN_VARBINARY paren_char_length
3728 | binary_large_object_string_type
3730 binary_large_object_string_type:
3731 SQL_TOKEN_BINARY SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
3739 | SQL_TOKEN_BLOB opt_paren_char_large_length
3748 | approximate_numeric_type
3750 opt_paren_precision_scale:
3751 {$$
= SQL_NEW_RULE
;}
3752 |
'(' SQL_TOKEN_INTNUM
')'
3755 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
3757 $$
->append
($3 = newNode
(")", SQL_NODE_PUNCTUATION
));
3759 |
'(' SQL_TOKEN_INTNUM
',' SQL_TOKEN_INTNUM
')'
3762 $$
->append
($1 = newNode
("(", SQL_NODE_PUNCTUATION
));
3764 $$
->append
($3 = newNode
(",", SQL_NODE_PUNCTUATION
));
3766 $$
->append
($5 = newNode
(")", SQL_NODE_PUNCTUATION
));
3770 SQL_TOKEN_NUMERIC opt_paren_precision_scale
3776 | SQL_TOKEN_DECIMAL opt_paren_precision_scale
3782 | SQL_TOKEN_DEC opt_paren_precision_scale
3788 | SQL_TOKEN_SMALLINT
3793 approximate_numeric_type:
3794 SQL_TOKEN_FLOAT
'(' SQL_TOKEN_INTNUM
')'
3798 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
3800 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
3805 | SQL_TOKEN_DOUBLE SQL_TOKEN_PRECISION
3817 | SQL_TOKEN_TIME opt_paren_precision opt_with_or_without_time_zone
3824 | SQL_TOKEN_TIMESTAMP opt_paren_precision opt_with_or_without_time_zone
3832 opt_with_or_without_time_zone:
3833 {$$
= SQL_NEW_RULE
;}
3834 | SQL_TOKEN_WITH SQL_TOKEN_TIME SQL_TOKEN_ZONE
3841 | SQL_TOKEN_WITHOUT SQL_TOKEN_TIME SQL_TOKEN_ZONE
3850 SQL_TOKEN_INTERVAL interval_qualifier
3857 /* the various things you can name */
3861 | SQL_TOKEN_POSITION
3863 sal_uInt32 nNod
= $$
->getRuleID
();
3865 $$
= newNode
(xxx_pGLOBAL_SQLPARSER
->TokenIDToStr
(nNod
), SQL_NODE_NAME
);
3867 | SQL_TOKEN_CHAR_LENGTH
3869 sal_uInt32 nNod
= $$
->getRuleID
();
3871 $$
= newNode
(xxx_pGLOBAL_SQLPARSER
->TokenIDToStr
(nNod
), SQL_NODE_NAME
);
3875 sal_uInt32 nNod
= $$
->getRuleID
();
3877 $$
= newNode
(xxx_pGLOBAL_SQLPARSER
->TokenIDToStr
(nNod
), SQL_NODE_NAME
);
3882 | case_specification
3885 SQL_TOKEN_NULLIF
'(' value_exp_commalist
')'
3889 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
3891 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
3893 | SQL_TOKEN_COALESCE
'(' value_exp
')'
3897 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
3899 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
3901 | SQL_TOKEN_COALESCE
'(' value_exp_commalist
')'
3905 $$
->append
($2 = newNode
("(", SQL_NODE_PUNCTUATION
));
3907 $$
->append
($4 = newNode
(")", SQL_NODE_PUNCTUATION
));
3915 SQL_TOKEN_CASE case_operand simple_when_clause_list else_clause SQL_TOKEN_END
3926 SQL_TOKEN_CASE searched_when_clause_list else_clause SQL_TOKEN_END
3935 simple_when_clause_list:
3938 $$
= SQL_NEW_LISTRULE
;
3941 | searched_when_clause_list simple_when_clause
3948 SQL_TOKEN_WHEN when_operand_list SQL_TOKEN_THEN result
3959 {$$
= SQL_NEW_COMMALISTRULE
;
3961 | when_operand_list
',' when_operand
3966 row_value_constructor_elem
3967 | comparison_predicate_part_2
3968 | between_predicate_part_2
3969 | in_predicate_part_2
3970 | character_like_predicate_part_2
3971 | null_predicate_part_2
3973 searched_when_clause_list:
3974 searched_when_clause
3976 $$
= SQL_NEW_LISTRULE
;
3979 | searched_when_clause_list searched_when_clause
3985 searched_when_clause:
3986 SQL_TOKEN_WHEN search_condition SQL_TOKEN_THEN result
3996 {$$
= SQL_NEW_RULE
;}
3997 | SQL_TOKEN_ELSE result
4011 row_value_constructor_elem
4014 cursor: SQL_TOKEN_NAME
4020 module: SQL_TOKEN_NAME
4029 $$
->append
($1 = newNode
(":", SQL_NODE_PUNCTUATION
));
4032 {$$
= SQL_NEW_RULE
; // test
4033 $$
->append
($1 = newNode
("?", SQL_NODE_PUNCTUATION
));}
4034 |
'[' SQL_TOKEN_NAME
']'
4036 $$
->append
($1 = newNode
("[", SQL_NODE_PUNCTUATION
));
4038 $$
->append
($3 = newNode
("]", SQL_NODE_PUNCTUATION
));}
4042 procedure: SQL_TOKEN_NAME
4049 {$$
= SQL_NEW_RULE
;}
4050 | opt_as SQL_TOKEN_NAME
4057 user: SQL_TOKEN_NAME
4060 /* PREDICATECHECK RULES */
4062 search_condition
/* checking predicats */
4064 if
(xxx_pGLOBAL_SQLPARSER
->inPredicateCheck
()) // sql: rule 1
4067 if
( SQL_ISRULE
($$
,search_condition
) )
4069 $$
->insert
(0,newNode
("(", SQL_NODE_PUNCTUATION
));
4070 $$
->append
(newNode
(")", SQL_NODE_PUNCTUATION
));
4076 |
'(' sql
')' /* checking predicats */
4079 SQL_TOKEN_CREATE SQL_TOKEN_TRIGGER trigger_name trigger_action_time trigger_event SQL_TOKEN_ON table_name op_referencing triggered_action
4097 | SQL_TOKEN_REFERENCING transition_table_or_variable_list
4104 trigger_action_time:
4107 | SQL_TOKEN_INSTEAD SQL_TOKEN_OF
4117 | SQL_TOKEN_UPDATE op_trigger_columnlist
4124 op_trigger_columnlist:
4128 | SQL_TOKEN_OF trigger_column_list
4135 trigger_column_list:
4139 op_triggered_action_for triggered_when_clause triggered_SQL_statement
4147 op_triggered_action_for:
4151 | SQL_TOKEN_FOR SQL_TOKEN_EACH trigger_for
4161 | SQL_TOKEN_STATEMENT
4163 triggered_when_clause:
4167 | SQL_TOKEN_WHEN parenthesized_boolean_value_expression
4174 triggered_SQL_statement:
4175 SQL_procedure_statement
4176 | SQL_TOKEN_BEGIN SQL_TOKEN_ATOMIC SQL_procedure_statement_list
';' SQL_TOKEN_END
4182 $$
->append
($4 = newNode
(";", SQL_NODE_PUNCTUATION
));
4186 SQL_procedure_statement_list:
4187 SQL_procedure_statement
4189 $$
= SQL_NEW_LISTRULE
;
4192 | SQL_procedure_statement_list
';' SQL_procedure_statement
4198 SQL_procedure_statement:
4202 transition_table_or_variable_list:
4203 transition_table_or_variable
4205 $$
= SQL_NEW_LISTRULE
;
4208 | transition_table_or_variable_list transition_table_or_variable
4215 transition_table_or_variable:
4216 SQL_TOKEN_OLD opt_row opt_as old_transition_variable_name
4224 | SQL_TOKEN_NEW opt_row opt_as new_transition_variable_name
4232 | SQL_TOKEN_OLD SQL_TOKEN_TABLE opt_as old_transition_table_name
4240 | SQL_TOKEN_NEW SQL_TOKEN_TABLE opt_as new_transition_table_name
4249 old_transition_table_name:
4250 transition_table_name
4252 new_transition_table_name:
4253 transition_table_name
4255 transition_table_name:
4258 old_transition_variable_name:
4261 new_transition_variable_name:
4270 using namespace
::com
::sun
::star
::sdbc
;
4271 using namespace
::com
::sun
::star
::beans
;
4272 using namespace
::com
::sun
::star
::uno
;
4273 using namespace
::com
::sun
::star
::i18n
;
4274 using namespace
::com
::sun
::star
::lang
;
4275 using namespace
::com
::sun
::star
::util
;
4276 using namespace
::osl
;
4277 using namespace
::dbtools
;
4279 //============================================================
4280 //= a helper for static ascii pseudo-unicode strings
4281 //============================================================
4283 struct _ConstAsciiString_
4286 sal_Char
const* str
;
4288 operator rtl
::OUString
() const { return rtl
::OUString
(str
, length
, RTL_TEXTENCODING_ASCII_US
); }
4289 operator
const sal_Char
* () const { return str
; }
4290 operator
::rtl
::OString
() const { return str
; }
4293 #define IMPLEMENT_CONSTASCII_STRING( name, string ) \
4294 _ConstAsciiString_
const name
= { sizeof
(string)-1, string }
4296 IMPLEMENT_CONSTASCII_STRING
(ERROR_STR_GENERAL
, "Syntax error in SQL expression");
4297 IMPLEMENT_CONSTASCII_STRING
(ERROR_STR_VALUE_NO_LIKE
, "The value #1 can not be used with LIKE.");
4298 IMPLEMENT_CONSTASCII_STRING
(ERROR_STR_FIELD_NO_LIKE
, "LIKE can not be used with this field.");
4299 IMPLEMENT_CONSTASCII_STRING
(ERROR_STR_INVALID_COMPARE
, "The entered criterion can not be compared with this field.");
4300 IMPLEMENT_CONSTASCII_STRING
(ERROR_STR_INVALID_DATE_COMPARE
, "The field can not be compared with a date.");
4301 IMPLEMENT_CONSTASCII_STRING
(ERROR_STR_INVALID_REAL_COMPARE
, "The field can not be compared with a floating point number.");
4302 IMPLEMENT_CONSTASCII_STRING
(ERROR_STR_INVALID_INT_COMPARE
, "The field can not be compared with a number.");
4303 IMPLEMENT_CONSTASCII_STRING
(ERROR_STR_INVALID_TABLE
, "The database does not contain a table named \"#\".");
4304 IMPLEMENT_CONSTASCII_STRING
(ERROR_STR_INVALID_TABLE_OR_QUERY
, "The database does contain neither a table nor a query named \"#\".");
4305 IMPLEMENT_CONSTASCII_STRING
(ERROR_STR_INVALID_COLUMN
, "The column \"#1\" is unknown in the table \"#2\".");
4306 IMPLEMENT_CONSTASCII_STRING
(ERROR_STR_INVALID_TABLE_EXIST
, "The database already contains a table or view with name \"#\".");
4307 IMPLEMENT_CONSTASCII_STRING
(ERROR_STR_INVALID_QUERY_EXIST
, "The database already contains a query with name \"#\".");
4309 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_LIKE
, "LIKE");
4310 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_NOT
, "NOT");
4311 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_NULL
, "NULL");
4312 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_TRUE
, "True");
4313 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_FALSE
, "False");
4314 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_IS
, "IS");
4315 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_BETWEEN
, "BETWEEN");
4316 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_OR
, "OR");
4317 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_AND
, "AND");
4318 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_AVG
, "AVG");
4319 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_COUNT
, "COUNT");
4320 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_MAX
, "MAX");
4321 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_MIN
, "MIN");
4322 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_SUM
, "SUM");
4323 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_EVERY
, "EVERY");
4324 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_ANY
, "ANY");
4325 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_SOME
, "SOME");
4326 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_STDDEV_POP
, "STDDEV_POP");
4327 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_STDDEV_SAMP
, "STDDEV_SAMP");
4328 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_VAR_SAMP
, "VAR_SAMP");
4329 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_VAR_POP
, "VAR_POP");
4330 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_COLLECT
, "COLLECT");
4331 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_FUSION
, "FUSION");
4332 IMPLEMENT_CONSTASCII_STRING
(KEY_STR_INTERSECTION
, "INTERSECTION");
4334 IMPLEMENT_CONSTASCII_STRING
(FIELD_STR_NULLDATE
, "NullDate");
4336 IMPLEMENT_CONSTASCII_STRING
(STR_SQL_TOKEN
, "SQL_TOKEN_");
4338 //==========================================================================
4340 //==========================================================================
4341 //-----------------------------------------------------------------------------
4342 OParseContext::OParseContext
()
4346 //-----------------------------------------------------------------------------
4347 OParseContext::~OParseContext
()
4351 //-----------------------------------------------------------------------------
4352 ::rtl
::OUString OParseContext
::getErrorMessage
(ErrorCode _eCode
) const
4354 ::rtl
::OUString aMsg
;
4357 case ERROR_GENERAL
: aMsg
= ERROR_STR_GENERAL
; break
;
4358 case ERROR_VALUE_NO_LIKE
: aMsg
= ERROR_STR_VALUE_NO_LIKE
; break
;
4359 case ERROR_FIELD_NO_LIKE
: aMsg
= ERROR_STR_FIELD_NO_LIKE
; break
;
4360 case ERROR_INVALID_COMPARE
: aMsg
= ERROR_STR_INVALID_COMPARE
; break
;
4361 case ERROR_INVALID_INT_COMPARE
: aMsg
= ERROR_STR_INVALID_INT_COMPARE
; break
;
4362 case ERROR_INVALID_DATE_COMPARE
: aMsg
= ERROR_STR_INVALID_DATE_COMPARE
; break
;
4363 case ERROR_INVALID_REAL_COMPARE
: aMsg
= ERROR_STR_INVALID_REAL_COMPARE
; break
;
4364 case ERROR_INVALID_TABLE
: aMsg
= ERROR_STR_INVALID_TABLE
; break
;
4365 case ERROR_INVALID_TABLE_OR_QUERY
: aMsg
= ERROR_STR_INVALID_TABLE_OR_QUERY
; break
;
4366 case ERROR_INVALID_COLUMN
: aMsg
= ERROR_STR_INVALID_COLUMN
; break
;
4367 case ERROR_INVALID_TABLE_EXIST
: aMsg
= ERROR_STR_INVALID_TABLE_EXIST
; break
;
4368 case ERROR_INVALID_QUERY_EXIST
: aMsg
= ERROR_STR_INVALID_QUERY_EXIST
; break
;
4370 OSL_FAIL
( "OParseContext::getErrorMessage: unknown error code!" );
4376 //-----------------------------------------------------------------------------
4377 ::rtl
::OString OParseContext
::getIntlKeywordAscii
(InternationalKeyCode _eKey
) const
4379 ::rtl
::OString aKeyword
;
4382 case KEY_LIKE
: aKeyword
= KEY_STR_LIKE
; break
;
4383 case KEY_NOT
: aKeyword
= KEY_STR_NOT
; break
;
4384 case KEY_NULL
: aKeyword
= KEY_STR_NULL
; break
;
4385 case KEY_TRUE
: aKeyword
= KEY_STR_TRUE
; break
;
4386 case KEY_FALSE
: aKeyword
= KEY_STR_FALSE
; break
;
4387 case KEY_IS
: aKeyword
= KEY_STR_IS
; break
;
4388 case KEY_BETWEEN
: aKeyword
= KEY_STR_BETWEEN
; break
;
4389 case KEY_OR
: aKeyword
= KEY_STR_OR
; break
;
4390 case KEY_AND
: aKeyword
= KEY_STR_AND
; break
;
4391 case KEY_AVG
: aKeyword
= KEY_STR_AVG
; break
;
4392 case KEY_COUNT
: aKeyword
= KEY_STR_COUNT
; break
;
4393 case KEY_MAX
: aKeyword
= KEY_STR_MAX
; break
;
4394 case KEY_MIN
: aKeyword
= KEY_STR_MIN
; break
;
4395 case KEY_SUM
: aKeyword
= KEY_STR_SUM
; break
;
4396 case KEY_EVERY
: aKeyword
= KEY_STR_EVERY
; break
;
4397 case KEY_ANY
: aKeyword
= KEY_STR_ANY
; break
;
4398 case KEY_SOME
: aKeyword
= KEY_STR_SOME
; break
;
4399 case KEY_STDDEV_POP
: aKeyword
= KEY_STR_STDDEV_POP
; break
;
4400 case KEY_STDDEV_SAMP
: aKeyword
= KEY_STR_STDDEV_SAMP
; break
;
4401 case KEY_VAR_SAMP
: aKeyword
= KEY_STR_VAR_SAMP
; break
;
4402 case KEY_VAR_POP
: aKeyword
= KEY_STR_VAR_POP
; break
;
4403 case KEY_COLLECT
: aKeyword
= KEY_STR_COLLECT
; break
;
4404 case KEY_FUSION
: aKeyword
= KEY_STR_FUSION
; break
;
4405 case KEY_INTERSECTION
:aKeyword
= KEY_STR_INTERSECTION
; break
;
4406 case KEY_NONE
: break
;
4408 OSL_FAIL
( "OParseContext::getIntlKeywordAscii: unknown key!" );
4414 //-----------------------------------------------------------------------------
4415 IParseContext::InternationalKeyCode OParseContext
::getIntlKeyCode
(const ::rtl
::OString
& rToken
) const
4417 static IParseContext
::InternationalKeyCode Intl_TokenID
[] =
4419 KEY_LIKE
, KEY_NOT
, KEY_NULL
, KEY_TRUE
,
4420 KEY_FALSE
, KEY_IS
, KEY_BETWEEN
, KEY_OR
,
4421 KEY_AND
, KEY_AVG
, KEY_COUNT
, KEY_MAX
,
4422 KEY_MIN
, KEY_SUM
, KEY_EVERY
,KEY_ANY
,KEY_SOME
,
4423 KEY_STDDEV_POP
,KEY_STDDEV_SAMP
,KEY_VAR_SAMP
,
4424 KEY_VAR_POP
,KEY_COLLECT
,KEY_FUSION
,KEY_INTERSECTION
4427 sal_uInt32 nCount
= SAL_N_ELEMENTS
( Intl_TokenID
);
4428 for
(sal_uInt32 i
= 0; i
< nCount
; i
++)
4430 ::rtl
::OString aKey
= getIntlKeywordAscii
(Intl_TokenID
[i
]);
4431 if
(rToken.equalsIgnoreAsciiCase
(aKey
))
4432 return Intl_TokenID
[i
];
4438 //------------------------------------------------------------------------------
4439 static Locale
& impl_getLocaleInstance
( )
4441 static Locale s_aLocale
(
4442 ::rtl
::OUString
( "en" ),
4443 ::rtl
::OUString
( "US" ),
4449 //------------------------------------------------------------------------------
4450 Locale OParseContext
::getPreferredLocale
( ) const
4452 return getDefaultLocale
();
4455 //------------------------------------------------------------------------------
4456 const Locale
& OParseContext
::getDefaultLocale
()
4458 return impl_getLocaleInstance
();
4461 //==========================================================================
4463 //==========================================================================
4464 // Der (leider globale) yylval fuer die Uebergabe von
4465 // Werten vom Scanner an den Parser. Die globale Variable
4466 // wird nur kurzzeitig verwendet, der Parser liest die Variable
4467 // sofort nach dem Scanner-Aufruf in eine gleichnamige eigene
4470 //------------------------------------------------------------------
4471 ::rtl
::OUString ConvertLikeToken
(const OSQLParseNode
* pTokenNode
, const OSQLParseNode
* pEscapeNode
, sal_Bool bInternational
)
4473 ::rtl
::OUStringBuffer aMatchStr
(0);
4474 if
(pTokenNode
->isToken
())
4476 sal_Unicode cEscape
= 0;
4477 if
(pEscapeNode
->count
())
4478 cEscape
= pEscapeNode
->getChild
(1)->getTokenValue
().toChar
();
4480 // Platzhalter austauschen
4481 aMatchStr
= pTokenNode
->getTokenValue
();
4482 const sal_Int32 nLen
= aMatchStr.getLength
();
4483 ::rtl
::OUStringBuffer sSearch
,sReplace
;
4484 if
( bInternational
)
4486 sSearch.appendAscii
("%_",2);
4487 sReplace.appendAscii
("*?",2);
4491 sSearch.appendAscii
("*?",2);
4492 sReplace.appendAscii
("%_",2);
4495 bool wasEscape
= false
;
4496 for
(sal_Int32 i
= 0; i
< nLen
; i
++)
4498 const sal_Unicode c
= aMatchStr
[i
];
4499 // SQL standard requires the escape to be followed
4500 // by a meta-character ('%', '_' or itself), else error
4501 // We are more lenient here and let it escape anything.
4502 // Especially since some databases (e.g. Microsoft SQL Server)
4503 // have more meta-characters than the standard, such as e.g. '[' and ']'
4515 if
(c
== sSearch
[0])
4517 else if
(c
== sSearch
[1])
4522 aMatchStr
[i
] = sReplace
[match
];
4526 return aMatchStr.makeStringAndClear
();
4529 //==========================================================================
4531 //==========================================================================
4533 sal_uInt32 OSQLParser
::s_nRuleIDs
[OSQLParseNode
::rule_count
+ 1];
4534 OSQLParser::RuleIDMap OSQLParser
::s_aReverseRuleIDLookup
;
4535 OParseContext OSQLParser
::s_aDefaultContext
;
4537 sal_Int32 OSQLParser
::s_nRefCount
= 0;
4538 // ::osl::Mutex OSQLParser::s_aMutex;
4539 OSQLScanner
* OSQLParser
::s_pScanner
= 0;
4540 OSQLParseNodesGarbageCollector
* OSQLParser
::s_pGarbageCollector
= 0;
4541 ::com
::sun
::star
::uno
::Reference
< ::com
::sun
::star
::i18n
::XLocaleData4
> OSQLParser
::s_xLocaleData
= NULL
;
4542 //-----------------------------------------------------------------------------
4543 void setParser
(OSQLParser
* _pParser
)
4545 xxx_pGLOBAL_SQLPARSER
= _pParser
;
4547 // -------------------------------------------------------------------------
4548 void OSQLParser
::setParseTree
(OSQLParseNode
* pNewParseTree
)
4550 ::osl
::MutexGuard aGuard
(getMutex
());
4551 m_pParseTree
= pNewParseTree
;
4553 //-----------------------------------------------------------------------------
4555 /** Delete all comments in a query.
4557 See also getComment()/concatComment() implementation for
4558 OQueryController::translateStatement().
4560 static ::rtl
::OUString delComment
( const ::rtl
::OUString
& rQuery
)
4562 // First a quick search if there is any "--" or "//" or "/*", if not then the whole
4563 // copying loop is pointless.
4564 if
(rQuery.indexOfAsciiL
( "--", 2, 0) < 0 && rQuery.indexOfAsciiL
( "//", 2, 0) < 0 &&
4565 rQuery.indexOfAsciiL
( "/*", 2, 0) < 0)
4568 const sal_Unicode
* pCopy
= rQuery.getStr
();
4569 sal_Int32 nQueryLen
= rQuery.getLength
();
4570 bool bIsText1
= false
; // "text"
4571 bool bIsText2
= false
; // 'text'
4572 bool bComment2
= false
; // /* comment */
4573 bool bComment
= false
; // -- or // comment
4574 ::rtl
::OUStringBuffer aBuf
(nQueryLen
);
4575 for
(sal_Int32 i
=0; i
< nQueryLen
; ++i
)
4579 if
((i
+1) < nQueryLen
)
4581 if
(pCopy
[i
]=='*' && pCopy
[i
+1]=='/')
4589 // comment can't close anymore, actually an error, but..
4593 if
(pCopy
[i
] == '\n')
4597 if
(pCopy
[i
] == '\"' && !bIsText2
)
4598 bIsText1
= !bIsText1
;
4599 else if
(pCopy
[i
] == '\'' && !bIsText1
)
4600 bIsText2
= !bIsText2
;
4601 if
(!bIsText1
&& !bIsText2
&& (i
+1) < nQueryLen
)
4603 if
((pCopy
[i
]=='-' && pCopy
[i
+1]=='-') ||
(pCopy
[i
]=='/' && pCopy
[i
+1]=='/'))
4605 else if
((pCopy
[i
]=='/' && pCopy
[i
+1]=='*'))
4609 if
(!bComment
&& !bComment2
)
4610 aBuf.append
( &pCopy
[i
], 1);
4612 return aBuf.makeStringAndClear
();
4614 //-----------------------------------------------------------------------------
4615 OSQLParseNode
* OSQLParser
::parseTree
(::rtl
::OUString
& rErrorMessage
,
4616 const ::rtl
::OUString
& rStatement
,
4617 sal_Bool bInternational
)
4621 // Guard the parsing
4622 ::osl
::MutexGuard aGuard
(getMutex
());
4626 // delete comments before parsing
4627 ::rtl
::OUString sTemp
= delComment
(rStatement
);
4629 // defines how to scan
4630 s_pScanner
->SetRule
(s_pScanner
->GetSQLRule
()); // initial
4631 s_pScanner
->prepareScan
(sTemp
, m_pContext
, bInternational
);
4633 SQLyylval.pParseNode
= NULL
;
4635 m_pParseTree
= NULL
;
4636 m_sErrorMessage
= ::rtl
::OUString
();
4638 // ... und den Parser anwerfen ...
4639 if
(SQLyyparse
() != 0)
4641 // only set the error message, if it's not already set
4642 if
(m_sErrorMessage.isEmpty
())
4643 m_sErrorMessage
= s_pScanner
->getErrorMessage
();
4644 if
(m_sErrorMessage.isEmpty
())
4645 m_sErrorMessage
= m_pContext
->getErrorMessage
(IParseContext
::ERROR_GENERAL
);
4647 rErrorMessage
= m_sErrorMessage
;
4649 // clear the garbage collector
4650 (*s_pGarbageCollector
)->clearAndDelete
();
4655 (*s_pGarbageCollector
)->clear
();
4657 // Das Ergebnis liefern (den Root Parse Node):
4659 // OSL_ENSURE(Sdbyyval.pParseNode != NULL,"OSQLParser: Parser hat keinen ParseNode geliefert");
4660 // return Sdbyyval.pParseNode;
4661 // geht nicht wegen Bug in MKS YACC-erzeugtem Code (es wird ein falscher ParseNode
4664 // Stattdessen setzt die Parse-Routine jetzt den Member pParseTree
4665 // - einfach diesen zurueckliefern:
4666 OSL_ENSURE
(m_pParseTree
!= NULL
,"OSQLParser: Parser hat keinen ParseTree geliefert");
4667 return m_pParseTree
;
4670 //-----------------------------------------------------------------------------
4671 ::rtl
::OString OSQLParser
::TokenIDToStr
(sal_uInt32 nTokenID
, const IParseContext
* pContext
)
4673 ::rtl
::OString aStr
;
4676 IParseContext
::InternationalKeyCode eKeyCode
= IParseContext
::KEY_NONE
;
4679 case SQL_TOKEN_LIKE
: eKeyCode
= IParseContext
::KEY_LIKE
; break
;
4680 case SQL_TOKEN_NOT
: eKeyCode
= IParseContext
::KEY_NOT
; break
;
4681 case SQL_TOKEN_NULL
: eKeyCode
= IParseContext
::KEY_NULL
; break
;
4682 case SQL_TOKEN_TRUE
: eKeyCode
= IParseContext
::KEY_TRUE
; break
;
4683 case SQL_TOKEN_FALSE
: eKeyCode
= IParseContext
::KEY_FALSE
; break
;
4684 case SQL_TOKEN_IS
: eKeyCode
= IParseContext
::KEY_IS
; break
;
4685 case SQL_TOKEN_BETWEEN
: eKeyCode
= IParseContext
::KEY_BETWEEN
; break
;
4686 case SQL_TOKEN_OR
: eKeyCode
= IParseContext
::KEY_OR
; break
;
4687 case SQL_TOKEN_AND
: eKeyCode
= IParseContext
::KEY_AND
; break
;
4688 case SQL_TOKEN_AVG
: eKeyCode
= IParseContext
::KEY_AVG
; break
;
4689 case SQL_TOKEN_COUNT
: eKeyCode
= IParseContext
::KEY_COUNT
; break
;
4690 case SQL_TOKEN_MAX
: eKeyCode
= IParseContext
::KEY_MAX
; break
;
4691 case SQL_TOKEN_MIN
: eKeyCode
= IParseContext
::KEY_MIN
; break
;
4692 case SQL_TOKEN_SUM
: eKeyCode
= IParseContext
::KEY_SUM
; break
;
4694 if
( eKeyCode
!= IParseContext
::KEY_NONE
)
4695 aStr
= pContext
->getIntlKeywordAscii
(eKeyCode
);
4700 aStr
= yytname
[YYTRANSLATE
(nTokenID
)];
4701 if
(aStr.startsWith
("SQL_TOKEN_"))
4702 aStr
= aStr.copy
(10);
4707 #if OSL_DEBUG_LEVEL > 1
4708 ::rtl
::OUString OSQLParser
::RuleIDToStr
(sal_uInt32 nRuleID
)
4710 OSL_ENSURE
(nRuleID
< SAL_N_ELEMENTS
(yytname
), "OSQLParser::RuleIDToStr: Invalid nRuleId!");
4711 return
::rtl
::OUString
::createFromAscii
(yytname
[nRuleID
]);
4715 //-----------------------------------------------------------------------------
4716 sal_uInt32 OSQLParser
::StrToRuleID
(const ::rtl
::OString
& rValue
)
4718 // Search for the given name in yytname and return the index
4719 // (or UNKNOWN_RULE, if not found)
4720 static sal_uInt32 nLen
= SAL_N_ELEMENTS
(yytname
);
4721 for
(sal_uInt32 i
= YYTRANSLATE
(SQL_TOKEN_INVALIDSYMBOL
); i
< (nLen
-1); i
++)
4723 if
(rValue
== yytname
[i
])
4728 return OSQLParseNode
::UNKNOWN_RULE
;
4731 //-----------------------------------------------------------------------------
4732 OSQLParseNode::Rule OSQLParser
::RuleIDToRule
( sal_uInt32 _nRule
)
4734 OSQLParser
::RuleIDMap
::const_iterator i
(s_aReverseRuleIDLookup.find
(_nRule
));
4735 if
(i
== s_aReverseRuleIDLookup.end
())
4737 SAL_INFO
("connectivity.parse",
4738 "connectivity::OSQLParser::RuleIDToRule cannot reverse-lookup rule. "
4739 "Reverse mapping incomplete? "
4740 "_nRule='" << _nRule
<< "' "
4741 "yytname[_nRule]='" << yytname
[_nRule
] << "'");
4742 return OSQLParseNode
::UNKNOWN_RULE
;
4748 //-----------------------------------------------------------------------------
4749 sal_uInt32 OSQLParser
::RuleID
(OSQLParseNode
::Rule eRule
)
4751 return s_nRuleIDs
[(sal_uInt16
)eRule
];
4753 // -------------------------------------------------------------------------
4754 sal_Int16 OSQLParser
::buildNode
(OSQLParseNode
*& pAppend
,OSQLParseNode
* pCompare
,OSQLParseNode
* pLiteral
,OSQLParseNode
* pLiteral2
)
4756 OSQLParseNode
* pColumnRef
= new OSQLInternalNode
(aEmptyString
, SQL_NODE_RULE
,OSQLParser
::RuleID
(OSQLParseNode
::column_ref
));
4757 pColumnRef
->append
(new OSQLInternalNode
(m_sFieldName
,SQL_NODE_NAME
));
4758 OSQLParseNode
* pComp
= NULL
;
4759 if
( SQL_ISTOKEN
( pCompare
, BETWEEN
) && pLiteral2
)
4760 pComp
= new OSQLInternalNode
(aEmptyString
, SQL_NODE_RULE
,OSQLParser
::RuleID
(OSQLParseNode
::between_predicate_part_2
));
4762 pComp
= new OSQLInternalNode
(aEmptyString
, SQL_NODE_RULE
,OSQLParser
::RuleID
(OSQLParseNode
::comparison_predicate
));
4764 pComp
->append
(pColumnRef
);
4765 pComp
->append
(pCompare
);
4766 pComp
->append
(pLiteral
);
4769 pComp
->append
(new OSQLInternalNode
(aEmptyString
, SQL_NODE_KEYWORD
,SQL_TOKEN_AND
));
4770 pComp
->append
(pLiteral2
);
4772 pAppend
->append
(pComp
);
4775 //-----------------------------------------------------------------------------
4776 sal_Int16 OSQLParser
::buildStringNodes
(OSQLParseNode
*& pLiteral
)
4781 if
(SQL_ISRULE
(pLiteral
,set_fct_spec
) || SQL_ISRULE
(pLiteral
,general_set_fct
) || SQL_ISRULE
(pLiteral
,column_ref
)
4782 || SQL_ISRULE
(pLiteral
,subquery
))
4783 return
1; // here I have a function that I can't transform into a string
4785 if
(pLiteral
->getNodeType
() == SQL_NODE_INTNUM || pLiteral
->getNodeType
() == SQL_NODE_APPROXNUM || pLiteral
->getNodeType
() == SQL_NODE_ACCESS_DATE
)
4787 OSQLParseNode
* pParent
= pLiteral
->getParent
();
4789 OSQLParseNode
* pNewNode
= new OSQLInternalNode
(pLiteral
->getTokenValue
(), SQL_NODE_STRING
);
4790 pParent
->replace
(pLiteral
, pNewNode
);
4796 for
(sal_uInt32 i
=0;i
<pLiteral
->count
();++i
)
4798 OSQLParseNode
* pChild
= pLiteral
->getChild
(i
);
4799 buildStringNodes
(pChild
);
4801 if
(SQL_ISRULE
(pLiteral
,term
) || SQL_ISRULE
(pLiteral
,value_exp_primary
))
4803 m_sErrorMessage
= m_pContext
->getErrorMessage
(IParseContext
::ERROR_INVALID_COMPARE
);
4808 //-----------------------------------------------------------------------------
4809 sal_Int16 OSQLParser
::buildComparsionRule
(OSQLParseNode
*& pAppend
,OSQLParseNode
* pLiteral
)
4811 OSQLParseNode
* pComp
= new OSQLInternalNode
(::rtl
::OUString
("="), SQL_NODE_EQUAL
);
4812 return buildPredicateRule
(pAppend
,pLiteral
,pComp
);
4816 //-----------------------------------------------------------------------------
4817 void OSQLParser
::reduceLiteral
(OSQLParseNode
*& pLiteral
, sal_Bool bAppendBlank
)
4819 OSL_ENSURE
(pLiteral
->isRule
(), "This is no ::com::sun::star::chaos::Rule");
4820 OSL_ENSURE
(pLiteral
->count
() == 2, "OSQLParser::ReduceLiteral() Invalid count");
4821 OSQLParseNode
* pTemp
= pLiteral
;
4822 ::rtl
::OUStringBuffer aValue
(pLiteral
->getChild
(0)->getTokenValue
());
4825 aValue.appendAscii
(" ");
4828 aValue.append
(pLiteral
->getChild
(1)->getTokenValue
());
4830 pLiteral
= new OSQLInternalNode
(aValue.makeStringAndClear
(),SQL_NODE_STRING
);
4834 // -------------------------------------------------------------------------
4835 void OSQLParser
::error(const sal_Char
*fmt
)
4837 if
(m_sErrorMessage.isEmpty
())
4839 ::rtl
::OUString sStr
(fmt
,strlen
(fmt
),RTL_TEXTENCODING_UTF8
);
4840 ::rtl
::OUString sSQL_TOKEN
("SQL_TOKEN_");
4842 sal_Int32 nPos1
= sStr.indexOf
(sSQL_TOKEN
);
4845 ::rtl
::OUString sFirst
= sStr.copy
(0,nPos1
);
4846 sal_Int32 nPos2
= sStr.indexOf
(sSQL_TOKEN
,nPos1
+1);
4849 ::rtl
::OUString sSecond
= sStr.copy
(nPos1
+sSQL_TOKEN.getLength
(),nPos2
-nPos1
-sSQL_TOKEN.getLength
());
4851 sFirst
+= sStr.copy
(nPos2
+sSQL_TOKEN.getLength
());
4854 sFirst
+= sStr.copy
(nPos1
+sSQL_TOKEN.getLength
());
4856 m_sErrorMessage
= sFirst
;
4859 m_sErrorMessage
= sStr
;
4861 ::rtl
::OUString aError
= s_pScanner
->getErrorMessage
();
4862 if
(!aError.isEmpty
())
4864 m_sErrorMessage
+= ::rtl
::OUString
(", ");
4865 m_sErrorMessage
+= aError
;
4869 // -------------------------------------------------------------------------
4870 int OSQLParser
::SQLlex
()
4872 return s_pScanner
->SQLlex
();
4875 #if defined __SUNPRO_CC
4877 #elif defined _MSC_VER
4878 #pragma warning(pop)