diff options
Diffstat (limited to 'connectivity/source/parse/sqlbison.y')
-rwxr-xr-x | connectivity/source/parse/sqlbison.y | 4828 |
1 files changed, 0 insertions, 4828 deletions
diff --git a/connectivity/source/parse/sqlbison.y b/connectivity/source/parse/sqlbison.y deleted file mode 100755 index 1f2c577b8d..0000000000 --- a/connectivity/source/parse/sqlbison.y +++ /dev/null @@ -1,4828 +0,0 @@ -%{ -//-------------------------------------------------------------------------- -// -// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -// -// Copyright 2000, 2010 Oracle and/or its affiliates. -// -// OpenOffice.org - a multi-platform office productivity suite -// -// This file is part of OpenOffice.org. -// -// OpenOffice.org is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License version 3 -// only, as published by the Free Software Foundation. -// -// OpenOffice.org is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License version 3 for more details -// (a copy is included in the LICENSE file that accompanied this code). -// -// You should have received a copy of the GNU Lesser General Public License -// version 3 along with OpenOffice.org. If not, see -// <http://www.openoffice.org/license.html> -// for a copy of the LGPLv3 License. -// -//-------------------------------------------------------------------------- - -#include <vector> -#include <string.h> - -#ifndef _CONNECTIVITY_SQLNODE_HXX -#include <connectivity/sqlnode.hxx> -#endif -#ifndef _CONNECTIVITY_SQLPARSE_HXX -#include <connectivity/sqlparse.hxx> -#endif -#ifndef _CONNECTIVITY_SQLINTERNALNODE_HXX -#include <internalnode.hxx> -#endif -#ifndef _COM_SUN_STAR_LANG_LOCALE_HPP_ -#include <com/sun/star/lang/Locale.hpp> -#endif -#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_ -#include <com/sun/star/sdbc/DataType.hpp> -#endif -#ifndef _COM_SUN_STAR_UTIL_DATE_HPP_ -#include <com/sun/star/util/Date.hpp> -#endif -#ifndef _COM_SUN_STAR_UTIL_DATETIME_HPP_ -#include <com/sun/star/util/DateTime.hpp> -#endif -#ifndef _COM_SUN_STAR_UTIL_TIME_HPP_ -#include <com/sun/star/util/Time.hpp> -#endif -#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTER_HPP_ -#include <com/sun/star/util/XNumberFormatter.hpp> -#endif -#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATSSUPPLIER_HPP_ -#include <com/sun/star/util/XNumberFormatsSupplier.hpp> -#endif -#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATS_HPP_ -#include <com/sun/star/util/XNumberFormats.hpp> -#endif -#ifndef _COM_SUN_STAR_UTIL_NUMBERFORMAT_HPP_ -#include <com/sun/star/util/NumberFormat.hpp> -#endif -#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTYPES_HPP_ -#include <com/sun/star/util/XNumberFormatTypes.hpp> -#endif -#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_ -#include <com/sun/star/beans/XPropertySet.hpp> -#endif -#ifndef _COM_SUN_STAR_I18N_KPARSETYPE_HPP_ -#include <com/sun/star/i18n/KParseType.hpp> -#endif -#ifndef _COM_SUN_STAR_I18N_KPARSETOKENS_HPP_ -#include <com/sun/star/i18n/KParseTokens.hpp> -#endif -#ifndef _CONNECTIVITY_SQLSCAN_HXX -#include "sqlscan.hxx" -#endif -#ifndef _OSL_DIAGNOSE_H_ -#include <osl/diagnose.h> -#endif -#ifndef _DBHELPER_DBCONVERSION_HXX_ -#include "connectivity/dbconversion.hxx" -#endif -#include <rtl/ustrbuf.hxx> -#include <sal/macros.h> - -#if defined __GNUC__ - #pragma GCC system_header -#elif defined __SUNPRO_CC -#pragma disable_warn -#elif defined _MSC_VER -#pragma warning(push, 1) -#pragma warning(disable:4273 4701 4706) -#endif - -static ::rtl::OUString aEmptyString; - -static connectivity::OSQLInternalNode* newNode(const sal_Char* pNewValue, - const connectivity::SQLNodeType eNodeType, - const sal_uInt32 nNodeID = 0) -{ - return new connectivity::OSQLInternalNode(pNewValue, eNodeType, nNodeID); -} - -static connectivity::OSQLInternalNode* newNode(const ::rtl::OString& _NewValue, - const connectivity::SQLNodeType eNodeType, - const sal_uInt32 nNodeID = 0) -{ - return new connectivity::OSQLInternalNode(_NewValue, eNodeType, nNodeID); -} - -static connectivity::OSQLInternalNode* newNode(const ::rtl::OUString& _NewValue, - const connectivity::SQLNodeType eNodeType, - const sal_uInt32 nNodeID = 0) -{ - return new connectivity::OSQLInternalNode(_NewValue, eNodeType, nNodeID); -} - - -// yyi ist die interne Nr. der Regel, die gerade reduziert wird. -// Ueber die Mapping-Tabelle yyrmap wird daraus eine externe Regel-Nr. -#define SQL_NEW_RULE newNode(aEmptyString, SQL_NODE_RULE, yyr1[yyn]) -#define SQL_NEW_LISTRULE newNode(aEmptyString, SQL_NODE_LISTRULE, yyr1[yyn]) -#define SQL_NEW_COMMALISTRULE newNode(aEmptyString, SQL_NODE_COMMALISTRULE, yyr1[yyn]) - - -connectivity::OSQLParser* xxx_pGLOBAL_SQLPARSER; - -#define YYERROR_VERBOSE - -#define SQLyyerror(s) \ -{ \ - xxx_pGLOBAL_SQLPARSER->error(s); \ -} - -using namespace connectivity; -#define SQLyylex xxx_pGLOBAL_SQLPARSER->SQLlex -%} - /* symbolic tokens */ - -%union { - connectivity::OSQLParseNode * pParseNode; -} -%type <pParseNode> '(' ')' ',' ':' ';' '?' '[' ']' '{' '}' '.' 'K' 'M' 'G' 'T' 'P' - -%token <pParseNode> SQL_TOKEN_STRING SQL_TOKEN_ACCESS_DATE SQL_TOKEN_INT SQL_TOKEN_REAL_NUM -%token <pParseNode> SQL_TOKEN_INTNUM SQL_TOKEN_APPROXNUM SQL_TOKEN_NOT SQL_TOKEN_NAME - - -%nonassoc <pParseNode> SQL_TOKEN_UMINUS - - - - /* literal keyword tokens */ - -%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 - -%token <pParseNode> SQL_TOKEN_BETWEEN SQL_TOKEN_BIT SQL_TOKEN_BOTH SQL_TOKEN_BY - -%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 -%token <pParseNode> SQL_TOKEN_CURRENT SQL_TOKEN_CURSOR - -%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 -%token <pParseNode> SQL_TOKEN_DISTINCT SQL_TOKEN_DOUBLE SQL_TOKEN_DROP - -%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 - -%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 - -%token <pParseNode> SQL_TOKEN_JOIN SQL_TOKEN_KEY SQL_TOKEN_LEADING SQL_TOKEN_LIKE SQL_TOKEN_LOCAL SQL_TOKEN_LOWER -%token <pParseNode> SQL_TOKEN_MAX SQL_TOKEN_MIN SQL_TOKEN_NATURAL SQL_TOKEN_NCHAR SQL_TOKEN_NULL SQL_TOKEN_NUMERIC - -%token <pParseNode> SQL_TOKEN_OCTET_LENGTH SQL_TOKEN_OF SQL_TOKEN_ON SQL_TOKEN_OPTION SQL_TOKEN_ORDER SQL_TOKEN_OUTER - -%token <pParseNode> SQL_TOKEN_PRECISION SQL_TOKEN_PRIMARY SQL_TOKEN_PRIVILEGES SQL_TOKEN_PROCEDURE SQL_TOKEN_PUBLIC -%token <pParseNode> SQL_TOKEN_REAL SQL_TOKEN_REFERENCES SQL_TOKEN_ROLLBACK - -%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 - -%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 -%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 -%token <pParseNode> SQL_TOKEN_WHERE SQL_TOKEN_WITH SQL_TOKEN_WORK SQL_TOKEN_ZONE - -/* ODBC KEYWORDS */ -%token <pParseNode> SQL_TOKEN_CALL SQL_TOKEN_D SQL_TOKEN_FN SQL_TOKEN_T SQL_TOKEN_TS SQL_TOKEN_OJ -/* string functions */ -%token <pParseNode> SQL_TOKEN_ASCII SQL_TOKEN_BIT_LENGTH SQL_TOKEN_CHAR SQL_TOKEN_CHAR_LENGTH SQL_TOKEN_SQL_TOKEN_INTNUM -%token <pParseNode> SQL_TOKEN_CONCAT -%token <pParseNode> SQL_TOKEN_DIFFERENCE SQL_TOKEN_INSERT SQL_TOKEN_LCASE SQL_TOKEN_LEFT SQL_TOKEN_LENGTH SQL_TOKEN_LOCATE -%token <pParseNode> SQL_TOKEN_LOCATE_2 SQL_TOKEN_LTRIM SQL_TOKEN_POSITION SQL_TOKEN_REPEAT SQL_TOKEN_REPLACE -%token <pParseNode> SQL_TOKEN_RIGHT SQL_TOKEN_RTRIM SQL_TOKEN_SOUNDEX SQL_TOKEN_SPACE SQL_TOKEN_SUBSTRING SQL_TOKEN_UCASE - -/* time and date functions */ -%token <pParseNode> SQL_TOKEN_CURRENT_DATE SQL_TOKEN_CURRENT_TIME SQL_TOKEN_CURRENT_TIMESTAMP SQL_TOKEN_CURDATE SQL_TOKEN_CURTIME -%token <pParseNode> SQL_TOKEN_DAYNAME SQL_TOKEN_DAYOFMONTH SQL_TOKEN_DAYOFWEEK SQL_TOKEN_DAYOFYEAR SQL_TOKEN_EXTRACT -%token <pParseNode> SQL_TOKEN_HOUR SQL_TOKEN_MINUTE SQL_TOKEN_MONTH SQL_TOKEN_MONTHNAME SQL_TOKEN_NOW SQL_TOKEN_QUARTER SQL_TOKEN_DATEDIFF -%token <pParseNode> SQL_TOKEN_SECOND SQL_TOKEN_TIMESTAMPADD SQL_TOKEN_TIMESTAMPDIFF SQL_TOKEN_TIMEVALUE SQL_TOKEN_WEEK SQL_TOKEN_YEAR - -/* numeric functions */ -%token <pParseNode> SQL_TOKEN_ABS SQL_TOKEN_ACOS SQL_TOKEN_ASIN SQL_TOKEN_ATAN SQL_TOKEN_ATAN2 SQL_TOKEN_CEILING -%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 -%token <pParseNode> SQL_TOKEN_LOG10 SQL_TOKEN_MOD SQL_TOKEN_PI SQL_TOKEN_POWER SQL_TOKEN_RADIANS SQL_TOKEN_RAND SQL_TOKEN_ROUNDMAGIC -%token <pParseNode> SQL_TOKEN_ROUND SQL_TOKEN_SIGN SQL_TOKEN_SIN SQL_TOKEN_SQRT SQL_TOKEN_TAN SQL_TOKEN_TRUNCATE - -// computational operation -%token <pParseNode> SQL_TOKEN_EVERY SQL_TOKEN_INTERSECTION SQL_TOKEN_FUSION SQL_TOKEN_COLLECT SQL_TOKEN_VAR_POP SQL_TOKEN_VAR_SAMP -%token <pParseNode> SQL_TOKEN_STDDEV_SAMP SQL_TOKEN_STDDEV_POP - -%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 -%token <pParseNode> SQL_TOKEN_CASE SQL_TOKEN_THEN SQL_TOKEN_END SQL_TOKEN_NULLIF SQL_TOKEN_COALESCE SQL_TOKEN_WHEN SQL_TOKEN_ELSE -%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 -%token <pParseNode> SQL_TOKEN_NEW SQL_TOKEN_OLD -%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 -%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 -%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 -// window function -%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 -%token <pParseNode> SQL_TOKEN_FIRST_VALUE SQL_TOKEN_LAST_VALUE SQL_TOKEN_NTH_VALUE SQL_TOKEN_FIRST SQL_TOKEN_LAST -%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 -%token <pParseNode> SQL_TOKEN_PARTITION SQL_TOKEN_WINDOW SQL_TOKEN_NO -// LIMIT and OFFSEt -%token <pParseNode> SQL_TOKEN_LIMIT SQL_TOKEN_OFFSET SQL_TOKEN_NEXT SQL_TOKEN_ONLY - - /* operators */ -%left SQL_TOKEN_NAME -%left <pParseNode> SQL_TOKEN_OR -%left <pParseNode> SQL_TOKEN_AND - -%left <pParseNode> SQL_LESSEQ SQL_GREATEQ SQL_NOTEQUAL SQL_LESS SQL_GREAT SQL_EQUAL /* '<' '>' = <> < > <= >= != */ -%left <pParseNode> '+' '-' SQL_CONCAT -%left <pParseNode> '*' '/' -%left SQL_TOKEN_NATURAL SQL_TOKEN_CROSS SQL_TOKEN_FULL SQL_TOKEN_LEFT SQL_TOKEN_RIGHT -%left ')' -%right '=' -%right '.' -%right '(' - - -%token <pParseNode> SQL_TOKEN_INVALIDSYMBOL - -/*%type <pParseNode> sql_single_statement */ - -%type <pParseNode> sql /*schema */ -%type <pParseNode> column_def_opt_list column_def_opt table_constraint_def column_commalist -%type <pParseNode> view_def opt_with_check_option opt_column_commalist privilege_def -%type <pParseNode> opt_with_grant_option privileges operation_commalist operation -%type <pParseNode> grantee_commalist grantee opt_order_by_clause ordering_spec_commalist -%type <pParseNode> ordering_spec opt_asc_desc manipulative_statement commit_statement -%type <pParseNode> /*delete_statement_positioned*/ delete_statement_searched fetch_statement -%type <pParseNode> insert_statement values_or_query_spec -%type <pParseNode> rollback_statement select_statement_into opt_all_distinct -%type <pParseNode> /*update_statement_positioned*/ assignment_commalist assignment -%type <pParseNode> update_statement_searched target_commalist target opt_where_clause -%type <pParseNode> select_statement selection table_exp from_clause table_ref_commalist table_ref -%type <pParseNode> where_clause opt_group_by_clause column_ref_commalist opt_having_clause -%type <pParseNode> search_condition predicate comparison_predicate comparison_predicate_part_2 between_predicate between_predicate_part_2 -%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 -%type <pParseNode> all_or_any_predicate any_all_some existence_test subquery quantified_comparison_predicate_part_2 -%type <pParseNode> scalar_exp_commalist parameter_ref literal parenthesized_boolean_value_expression -%type <pParseNode> column_ref data_type column cursor parameter range_variable user /*like_check*/ -/* neue Regeln bei OJ */ -%type <pParseNode> derived_column as_clause table_name num_primary term num_value_exp -%type <pParseNode> value_exp_primary num_value_fct unsigned_value_spec cast_spec set_fct_spec scalar_subquery -%type <pParseNode> position_exp extract_exp length_exp general_value_spec -%type <pParseNode> general_set_fct set_fct_type query_exp non_join_query_exp joined_table -%type <pParseNode> non_join_query_term non_join_query_primary simple_table -%type <pParseNode> table_value_const_list row_value_constructor row_value_const_list row_value_constructor_elem -%type <pParseNode> qualified_join value_exp query_term join_type outer_join_type join_condition boolean_term -%type <pParseNode> boolean_factor truth_value boolean_test boolean_primary named_columns_join join_spec -%type <pParseNode> cast_operand cast_target factor datetime_value_exp /*interval_value_exp*/ datetime_term datetime_factor -%type <pParseNode> datetime_primary datetime_value_fct time_zone time_zone_specifier /*interval_term*/ interval_qualifier -%type <pParseNode> start_field non_second_datetime_field end_field single_datetime_field extract_field datetime_field time_zone_field -%type <pParseNode> extract_source char_length_exp octet_length_exp bit_length_exp select_sublist string_value_exp -%type <pParseNode> char_value_exp concatenation char_factor char_primary string_value_fct char_substring_fct fold -%type <pParseNode> form_conversion char_translation trim_fct trim_operands trim_spec bit_value_fct bit_substring_fct op_column_commalist -%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 -%type <pParseNode> function_arg_commalist3 string_function_3Argument function_arg_commalist4 string_function_4Argument function_arg_commalist2 string_function_1Argument string_function_2Argument -%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 -%type <pParseNode> all query_primary sql_not for_length upper_lower comparison column_val cross_union /*opt_schema_element_list*/ -%type <pParseNode> /*op_authorization op_schema*/ nil_fkt schema_element base_table_def base_table_element base_table_element_commalist -%type <pParseNode> column_def odbc_fct_spec odbc_call_spec odbc_fct_type op_parameter union_statement -%type <pParseNode> op_odbc_call_parameter odbc_parameter_commalist odbc_parameter function_args_commalist function_arg -%type <pParseNode> catalog_name schema_name table_node numeric_function string_function function_name date_function table_primary_as_range_column opt_as -%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 -%type <pParseNode> case_expression else_clause result_expression result case_abbreviation case_specification searched_when_clause simple_when_clause searched_case simple_case -%type <pParseNode> when_operand_list when_operand case_operand -%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 -%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 -%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 -%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 -%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 -%type <pParseNode> approximate_numeric_type exact_numeric_type opt_paren_precision_scale -/* window function rules */ -%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 -%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 -%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 -%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 -%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 -%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 -%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 -/* LIMIT and OFFSET */ -%type <pParseNode> opt_limit_offset_clause limit_offset_clause opt_fetch_first_clause -%% - -/* Parse Tree an OSQLParser zurueckliefern - * (der Zugriff ueber yyval nach Aufruf des Parsers scheitert, - * - */ -sql_single_statement: - sql - { xxx_pGLOBAL_SQLPARSER->setParseTree( $1 ); } - | sql ';' - { xxx_pGLOBAL_SQLPARSER->setParseTree( $1 ); } - ; - - /* schema definition language */ - /* Note: other ``sql:sal_Unicode() rules appear later in the grammar */ - -sql: - manipulative_statement - | schema_element - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; - -/*** - -op_authorization: - {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_AUTHORIZATION user - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -op_schema: - {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_NAME - | SQL_TOKEN_NAME '.' SQL_TOKEN_NAME - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - ; - -schema: - SQL_TOKEN_CREATE SQL_TOKEN_SCHEMA op_schema op_authorization opt_schema_element_list - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - } - ; - -opt_schema_element_list: - {$$ = SQL_NEW_RULE;} - | schema_glement_list - ; - -schema_element_list: - schema_element - {$$ = SQL_NEW_LISTRULE; - $$->append($1);} - | schema_element_list schema_element - {$1->append($2); - $$ = $1;} - ; -*/ - -schema_element: - base_table_def - | view_def - | privilege_def - | trigger_definition - ; - -base_table_def: - SQL_TOKEN_CREATE SQL_TOKEN_TABLE table_node '(' base_table_element_commalist ')' - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($5); - $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));} - ; - -base_table_element_commalist: - base_table_element - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | base_table_element_commalist ',' base_table_element - {$1->append($3); - $$ = $1;} - ; - -base_table_element: - column_def - | table_constraint_def - ; - -column_def: - column data_type column_def_opt_list - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; - -column_def_opt_list: - /* empty */ {$$ = SQL_NEW_LISTRULE;} - | column_def_opt_list column_def_opt - {$1->append($2); - $$ = $1;} - ; - -nil_fkt: - datetime_value_fct - ; -unique_spec: - SQL_TOKEN_UNIQUE - | SQL_TOKEN_PRIMARY SQL_TOKEN_KEY - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -column_def_opt: - SQL_TOKEN_NOT SQL_TOKEN_NULL - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - | unique_spec - | SQL_TOKEN_DEFAULT literal - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - | SQL_TOKEN_DEFAULT SQL_TOKEN_NULL - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - | SQL_TOKEN_DEFAULT SQL_TOKEN_USER - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - | SQL_TOKEN_DEFAULT nil_fkt - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_CHECK - | SQL_TOKEN_CHECK '(' search_condition ')' - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));} - | SQL_TOKEN_REFERENCES table_node - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - | SQL_TOKEN_REFERENCES table_node '(' column_commalist ')' - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($4); - $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));} - ; - -table_constraint_def: - unique_spec '(' column_commalist ')' - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));} - | SQL_TOKEN_FOREIGN SQL_TOKEN_KEY '(' column_commalist ')' SQL_TOKEN_REFERENCES table_node - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($4); - $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION)); - $$->append($6); - $$->append($7);} - | SQL_TOKEN_FOREIGN SQL_TOKEN_KEY '(' column_commalist ')' SQL_TOKEN_REFERENCES table_node '(' column_commalist ')' - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($4); - $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION)); - $$->append($6); - $$->append($7); - $$->append($8 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($9); - $$->append($10 = newNode(")", SQL_NODE_PUNCTUATION));} - | SQL_TOKEN_CHECK '(' search_condition ')' - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));} - ; -op_column_commalist: - /* empty */ {$$ = SQL_NEW_RULE;} - | '(' column_commalist ')' - {$$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -column_commalist: - column_commalist ',' column - {$1->append($3); - $$ = $1;} - | column - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - ; - -view_def: - SQL_TOKEN_CREATE SQL_TOKEN_VIEW table_node opt_column_commalist SQL_TOKEN_AS select_statement opt_with_check_option - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6); - $$->append($7);} - ; - -opt_with_check_option: - /* empty */ {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_WITH SQL_TOKEN_CHECK SQL_TOKEN_OPTION - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3);} - ; - -opt_column_commalist: - /* empty */ {$$ = SQL_NEW_RULE;} - | '(' column_commalist ')' - {$$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));} - ; - -privilege_def: - SQL_TOKEN_GRANT privileges SQL_TOKEN_ON table_node SQL_TOKEN_TO grantee_commalist - opt_with_grant_option - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6); - $$->append($7);} - ; - -opt_with_grant_option: - /* empty */ {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_WITH SQL_TOKEN_GRANT SQL_TOKEN_OPTION - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3);} - ; - -privileges: - SQL_TOKEN_ALL SQL_TOKEN_PRIVILEGES - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - | operation_commalist - ; - -operation_commalist: - operation - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | operation_commalist ',' operation - {$1->append($3); - $$ = $1;} - ; - -operation: - SQL_TOKEN_SELECT - | SQL_TOKEN_INSERT opt_column_commalist - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - | SQL_TOKEN_DELETE - | SQL_TOKEN_UPDATE opt_column_commalist - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - | SQL_TOKEN_REFERENCES opt_column_commalist - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - | SQL_TOKEN_USAGE - ; - - -grantee_commalist: - grantee - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | grantee_commalist ',' grantee - {$1->append($3); - $$ = $1;} - ; - -grantee: - SQL_TOKEN_PUBLIC - | user - ; - - /* module language */ - -opt_order_by_clause: - /* empty */ {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_ORDER SQL_TOKEN_BY ordering_spec_commalist - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3);} - ; - -ordering_spec_commalist: - ordering_spec - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | ordering_spec_commalist ',' ordering_spec - {$1->append($3); - $$ = $1;} - ; - -ordering_spec: -/* SQL_TOKEN_INTNUM opt_asc_desc - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} -*/ - predicate opt_asc_desc - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - - | row_value_constructor_elem opt_asc_desc - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - ; - -opt_asc_desc: - {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_ASC - | SQL_TOKEN_DESC - ; - - -/*** -manipulative_statement_list: - manipulative_statement - {$$ = SQL_NEW_LISTRULE; - $$->append($1);} - | manipulative_statement_list manipulative_statement - {$1->append($2); - $$ = $1;} - ; -***/ - -sql_not: - {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_NOT - ; - -/* manipulative statements */ - -manipulative_statement: - commit_statement -/* | delete_statement_positioned*/ - | delete_statement_searched - | fetch_statement - | insert_statement - | rollback_statement - | select_statement_into -/* | update_statement_positioned*/ - | update_statement_searched - | union_statement - | '{' odbc_call_spec '}' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("{", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode("}", SQL_NODE_PUNCTUATION)); - } - ; - -union_statement: - select_statement - | union_statement SQL_TOKEN_UNION all select_statement - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; -commit_statement: - SQL_TOKEN_COMMIT SQL_TOKEN_WORK - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - ; -/* -delete_statement_positioned: - SQL_TOKEN_DELETE SQL_TOKEN_FROM table_node SQL_TOKEN_WHERE SQL_TOKEN_CURRENT SQL_TOKEN_OF cursor - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6); - $$->append($7);} - ; -*/ -delete_statement_searched: - SQL_TOKEN_DELETE SQL_TOKEN_FROM table_node opt_where_clause - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4);} - ; - -fetch_statement: - SQL_TOKEN_FETCH cursor SQL_TOKEN_INTO target_commalist - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4);} - ; - -insert_statement: - SQL_TOKEN_INSERT SQL_TOKEN_INTO table_node opt_column_commalist values_or_query_spec - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5);} - ; -values_or_query_spec: - SQL_TOKEN_VALUES '(' table_value_const_list ')' - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; - -table_value_const_list: - row_value_constructor - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | table_value_const_list ',' row_value_constructor - {$1->append($3); - $$ = $1;} - ; -row_value_const_list: - row_value_constructor_elem - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | row_value_const_list ',' row_value_constructor_elem - {$1->append($3); - $$ = $1;} - ; -row_value_constructor: - row_value_constructor_elem -/* | '(' row_value_const_list ')' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - */ - ; -row_value_constructor_elem: - value_exp /*[^')']*/ - | SQL_TOKEN_DEFAULT - ; - - -rollback_statement: - SQL_TOKEN_ROLLBACK SQL_TOKEN_WORK - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - ; - - - /* INTO target_commalist herausgenommen */ -select_statement_into: - SQL_TOKEN_SELECT opt_all_distinct selection SQL_TOKEN_INTO target_commalist table_exp - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6); } - ; - -opt_all_distinct: - {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_ALL - | SQL_TOKEN_DISTINCT - - ; -/* -update_statement_positioned: - SQL_TOKEN_UPDATE table_node SQL_TOKEN_SET assignment_commalist - SQL_TOKEN_WHERE SQL_TOKEN_CURRENT SQL_TOKEN_OF cursor - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6); - $$->append($7); - $$->append($8);} - ; -*/ -assignment_commalist: - assignment - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | assignment_commalist ',' assignment - {$1->append($3); - $$ = $1;} - ; - -assignment: - column SQL_EQUAL update_source - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3);} - ; -update_source: - value_exp - | SQL_TOKEN_DEFAULT - ; -update_statement_searched: - SQL_TOKEN_UPDATE table_node SQL_TOKEN_SET assignment_commalist opt_where_clause - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5);} - ; - -target_commalist: - target - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | target_commalist ',' target - {$1->append($3); - $$ = $1;} - ; - -target: - parameter_ref - ; - -opt_where_clause: - /* empty */ {$$ = SQL_NEW_RULE;} - | where_clause - ; - - /* query expressions */ - -query_term: - non_join_query_term - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -/* SELECT STATEMENT */ -select_statement: - SQL_TOKEN_SELECT opt_all_distinct selection table_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; - -selection: - '*' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("*", SQL_NODE_PUNCTUATION)); - } - | scalar_exp_commalist - ; -opt_result_offset_clause: - /* empty */ {$$ = SQL_NEW_RULE;} - | result_offset_clause - ; -result_offset_clause: - SQL_TOKEN_OFFSET offset_row_count row_or_rows - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -opt_fetch_first_row_count: - /* empty */ {$$ = SQL_NEW_RULE;} - | fetch_first_row_count - ; -first_or_next: - SQL_TOKEN_FIRST - | SQL_TOKEN_NEXT - ; -row_or_rows: - SQL_TOKEN_ROW - | SQL_TOKEN_ROWS - ; -opt_fetch_first_clause: - /* empty */ {$$ = SQL_NEW_RULE;} - | fetch_first_clause - ; -fetch_first_clause: - SQL_TOKEN_FETCH first_or_next opt_fetch_first_row_count row_or_rows SQL_TOKEN_ONLY - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - } - ; -offset_row_count: - literal - ; -fetch_first_row_count: - literal - ; - -opt_limit_offset_clause: - /* empty */ {$$ = SQL_NEW_RULE;} - | limit_offset_clause - ; -opt_offset: - /* empty */ {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_OFFSET SQL_TOKEN_INTNUM - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -limit_offset_clause: - SQL_TOKEN_LIMIT SQL_TOKEN_INTNUM opt_offset - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -table_exp: - 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 - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6); - $$->append($7); - $$->append($8); - $$->append($9); - } - ; - -from_clause: - SQL_TOKEN_FROM table_ref_commalist - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - ; - -table_ref_commalist: - - table_ref - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | table_ref_commalist ',' table_ref - {$1->append($3); - $$ = $1;} - ; - -opt_as: - /* empty */ {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_AS - ; -opt_row: - /* empty */ {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_ROW - ; -table_primary_as_range_column: - {$$ = SQL_NEW_RULE;} - | opt_as SQL_TOKEN_NAME op_column_commalist - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -table_ref: - table_node table_primary_as_range_column - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | subquery range_variable op_column_commalist - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | joined_table - | '{' SQL_TOKEN_OJ joined_table '}' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("{", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3); - $$->append($4 = newNode("}", SQL_NODE_PUNCTUATION)); - } - | '(' joined_table ')' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -where_clause: - SQL_TOKEN_WHERE search_condition - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - ; - -opt_group_by_clause: - /* empty */ {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_GROUP SQL_TOKEN_BY column_ref_commalist - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3);} - ; - -column_ref_commalist: - column_ref - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | set_fct_spec - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | column_ref_commalist ',' column_ref - {$1->append($3); - $$ = $1;} - | column_ref_commalist ',' set_fct_spec - {$1->append($3); - $$ = $1;} - ; - -opt_having_clause: - /* empty */ {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_HAVING search_condition - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - ; - - /* search conditions */ -truth_value: - SQL_TOKEN_TRUE - | SQL_TOKEN_FALSE - | SQL_TOKEN_UNKNOWN - | SQL_TOKEN_NULL - ; -boolean_primary: - predicate - | '(' search_condition ')' - { // boolean_primary: rule 2 - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | row_value_constructor_elem /*[^')' ',']*/ - { - if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck())// boolean_primary: rule 3 - { - $$ = SQL_NEW_RULE; - sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildComparsionRule($$,$1); - if(nErg == 1) - { - OSQLParseNode* pTemp = $$; - $$ = pTemp->removeAt((sal_uInt32)0); - delete pTemp; - } - else - { - delete $$; - if(nErg) - YYERROR; - else - YYABORT; - } - } - else - YYERROR; - } - ; -parenthesized_boolean_value_expression: - '(' search_condition ')' - { // boolean_primary: rule 2 - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -boolean_test: - boolean_primary - | boolean_primary SQL_TOKEN_IS sql_not truth_value - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; -boolean_factor: - boolean_test - | SQL_TOKEN_NOT boolean_test - { // boolean_factor: rule 1 - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -boolean_term: - boolean_factor - | boolean_term SQL_TOKEN_AND boolean_factor - { - $$ = SQL_NEW_RULE; // boolean_term: rule 1 - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -search_condition: - boolean_term - | search_condition SQL_TOKEN_OR boolean_term - { - $$ = SQL_NEW_RULE; // search_condition - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -predicate: - comparison_predicate - | between_predicate - | all_or_any_predicate - | existence_test - | unique_test - | test_for_null - | in_predicate - | like_predicate - ; -comparison_predicate_part_2: - comparison row_value_constructor - { - $$ = SQL_NEW_RULE; // comparison_predicate: rule 1 - $$->append($1); - $$->append($2); - } -comparison_predicate: - row_value_constructor comparison row_value_constructor - { - $$ = SQL_NEW_RULE; // comparison_predicate: rule 1 - $$->append($1); - $$->append($2); - $$->append($3); - } - | comparison row_value_constructor - { - if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // comparison_predicate: rule 2 - { - $$ = SQL_NEW_RULE; - sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildPredicateRule($$,$2,$1); - if(nErg == 1) - { - OSQLParseNode* pTemp = $$; - $$ = pTemp->removeAt((sal_uInt32)0); - delete pTemp; - } - else - { - delete $$; - YYABORT; - } - } - else - { - YYERROR; - } - } - ; -comparison: - SQL_LESS - | SQL_NOTEQUAL - | SQL_EQUAL - | SQL_GREAT - | SQL_LESSEQ - | SQL_GREATEQ - ; -between_predicate_part_2: - sql_not SQL_TOKEN_BETWEEN row_value_constructor SQL_TOKEN_AND row_value_constructor - { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // between_predicate: rule 2 - { - $$ = SQL_NEW_RULE; - - sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildPredicateRule($$,$3,$2,$5); - if(nErg == 1) - { - OSQLParseNode* pTemp = $$; - $$ = pTemp->removeAt((sal_uInt32)0); - OSQLParseNode* pColumnRef = $$->removeAt((sal_uInt32)0); - $$->insert(0,$1); - OSQLParseNode* pBetween_predicate = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::between_predicate)); - pBetween_predicate->append(pColumnRef); - pBetween_predicate->append($$); - $$ = pBetween_predicate; - - delete pTemp; - delete $4; - } - else - { - delete $$; - YYABORT; - } - } - else - { - $$ = SQL_NEW_RULE; // between_predicate: rule 1 - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - } - } -between_predicate: - row_value_constructor between_predicate_part_2 - { - $$ = SQL_NEW_RULE; // between_predicate: rule 1 - $$->append($1); - $$->append($2); - } - | between_predicate_part_2 - ; -character_like_predicate_part_2: - sql_not SQL_TOKEN_LIKE string_value_exp opt_escape - { - $$ = SQL_NEW_RULE; // like_predicate: rule 1 - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; -other_like_predicate_part_2: - sql_not SQL_TOKEN_LIKE value_exp_primary opt_escape - { - $$ = SQL_NEW_RULE; // like_predicate: rule 1 - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; -like_predicate: - row_value_constructor character_like_predicate_part_2 - { - $$ = SQL_NEW_RULE; // like_predicate: rule 1 - $$->append($1); - $$->append($2); - } - | row_value_constructor other_like_predicate_part_2 - { - $$ = SQL_NEW_RULE; // like_predicate: rule 3 - $$->append($1); - $$->append($2); - } - | character_like_predicate_part_2 - { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // like_predicate: rule 5 - { - OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); - pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME)); - - $$ = SQL_NEW_RULE; - $$->append(pColumnRef); - $$->append($1); - OSQLParseNode* p2nd = $1->removeAt(2); - OSQLParseNode* p3rd = $1->removeAt(2); - if ( !xxx_pGLOBAL_SQLPARSER->buildLikeRule($1,p2nd,p3rd) ) - { - delete $$; - YYABORT; - } - $1->append(p3rd); - } - else - YYERROR; - } - | other_like_predicate_part_2 - { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // like_predicate: rule 6 - { - OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); - pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME)); - - $$ = SQL_NEW_RULE; - $$->append(pColumnRef); - $$->append($1); - OSQLParseNode* p2nd = $1->removeAt(2); - OSQLParseNode* p3rd = $1->removeAt(2); - if ( !xxx_pGLOBAL_SQLPARSER->buildLikeRule($1,p2nd,p3rd) ) - { - delete $$; - YYABORT; - } - $1->append(p3rd); - } - else - YYERROR; - } - ; - -opt_escape: - /* empty */ {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_ESCAPE string_value_exp - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - | '{' SQL_TOKEN_ESCAPE SQL_TOKEN_STRING '}' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("{", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3); - $$->append($4 = newNode("}", SQL_NODE_PUNCTUATION)); - } - ; - -null_predicate_part_2: - SQL_TOKEN_IS sql_not SQL_TOKEN_NULL - { - $$ = SQL_NEW_RULE; // test_for_null: rule 1 - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -test_for_null: - row_value_constructor null_predicate_part_2 - { - $$ = SQL_NEW_RULE; // test_for_null: rule 1 - $$->append($1); - $$->append($2); - } - | null_predicate_part_2 - { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())// test_for_null: rule 2 - { - OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); - pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME)); - - $$ = SQL_NEW_RULE; - $$->append(pColumnRef); - $$->append($1); - } - else - YYERROR; - } - ; -in_predicate_value: - subquery - {$$ = SQL_NEW_RULE; - $$->append($1); - } - | '(' value_exp_commalist ')' - {$$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -in_predicate_part_2: - sql_not SQL_TOKEN_IN in_predicate_value - { - $$ = SQL_NEW_RULE;// in_predicate: rule 1 - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -in_predicate: - row_value_constructor in_predicate_part_2 - { - $$ = SQL_NEW_RULE;// in_predicate: rule 1 - $$->append($1); - $$->append($2); - } - | in_predicate_part_2 - { - if ( xxx_pGLOBAL_SQLPARSER->inPredicateCheck() )// in_predicate: rule 2 - { - OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); - pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME)); - - $$ = SQL_NEW_RULE; - $$->append(pColumnRef); - $$->append($1); - } - else - YYERROR; - } - ; -quantified_comparison_predicate_part_2: - comparison any_all_some subquery - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -all_or_any_predicate: - row_value_constructor quantified_comparison_predicate_part_2 - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | quantified_comparison_predicate_part_2 - { - if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) - { - OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); - pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME)); - - $$ = SQL_NEW_RULE; - $$->append(pColumnRef); - $$->append($1); - } - else - YYERROR; - } - ; - -any_all_some: - SQL_TOKEN_ANY - | SQL_TOKEN_ALL - | SQL_TOKEN_SOME - ; - -existence_test: - SQL_TOKEN_EXISTS subquery - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - ; -unique_test: - SQL_TOKEN_UNIQUE subquery - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2);} - ; -subquery: - '(' query_exp ')' - {$$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));} - ; - - /* scalar expressions */ -scalar_exp_commalist: - select_sublist - { - $$ = SQL_NEW_COMMALISTRULE; - $$->append($1); - } - | scalar_exp_commalist ',' select_sublist - { - $1->append($3); - $$ = $1; - } - ; -select_sublist: -/* table_node '.' '*' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($3 = newNode("*", SQL_NODE_PUNCTUATION)); - } -*/ - derived_column - - ; - -parameter_ref: - parameter - ; - -/* -op_like: - '*' - { - $$ = newNode("*", SQL_NODE_PUNCTUATION); - } - | '?' - { - $$ = newNode("?", SQL_NODE_PUNCTUATION); - } - | op_like '*' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("*", SQL_NODE_PUNCTUATION)); - xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_False); - } - | op_like '?' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("?", SQL_NODE_PUNCTUATION)); - xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_False); - } - ; -*/ - -literal: -/* SQL_TOKEN_STRING - | */SQL_TOKEN_INT - | SQL_TOKEN_REAL_NUM - | SQL_TOKEN_INTNUM - | SQL_TOKEN_APPROXNUM - | SQL_TOKEN_ACCESS_DATE -/* rules for predicate check */ - | literal SQL_TOKEN_STRING - { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_True); - } - else - YYERROR; - } - | literal SQL_TOKEN_INT - { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_True); - } - else - YYERROR; - } - | literal SQL_TOKEN_REAL_NUM - { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_True); - } - else - YYERROR; - } - | literal SQL_TOKEN_APPROXNUM - { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_True); - } - else - YYERROR; - } - ; - - /* miscellaneous */ -as_clause: - /* empty */ {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_AS column - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | column - ; -position_exp: - SQL_TOKEN_POSITION '(' value_exp SQL_TOKEN_IN value_exp ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | SQL_TOKEN_POSITION '(' value_exp_commalist ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -num_value_fct: - position_exp - | extract_exp - | length_exp - ; -char_length_exp: - SQL_TOKEN_CHAR_LENGTH '(' value_exp ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | SQL_TOKEN_SQL_TOKEN_INTNUM '(' value_exp ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - - ; -octet_length_exp: - SQL_TOKEN_OCTET_LENGTH '(' value_exp ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -bit_length_exp: - SQL_TOKEN_BIT_LENGTH '(' value_exp ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -length_exp: - char_length_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | octet_length_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | bit_length_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -datetime_field: - non_second_datetime_field - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | SQL_TOKEN_SECOND - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -extract_field: - time_zone_field - | datetime_field - | value_exp - ; -time_zone_field: - SQL_TOKEN_TIMEZONE_HOUR - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | SQL_TOKEN_TIMEZONE_MINUTE - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -extract_source: - datetime_value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - } -/* | interval_value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - } */ - ; -extract_exp: - SQL_TOKEN_EXTRACT '(' extract_field SQL_TOKEN_FROM value_exp ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -unsigned_value_spec: - general_value_spec - | literal - ; -general_value_spec: - parameter - | SQL_TOKEN_USER - /* | SQL_TOKEN_NULL*/ - | SQL_TOKEN_FALSE - | SQL_TOKEN_TRUE - | 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 - | SQL_TOKEN_SESSION_USER - | SQL_TOKEN_SYSTEM_USER - ; -set_fct_spec: - general_set_fct - | '{' odbc_fct_spec '}' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("{", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode("}", SQL_NODE_PUNCTUATION)); - } - | function_name '(' ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | function_name0 '(' ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | function_name1 '(' function_arg ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | function_name2 '(' function_arg_commalist2 ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | function_name3 '(' function_arg_commalist3 ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | string_function_4Argument '(' function_arg_commalist4 ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | function_name '(' function_args_commalist ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | function_name12 '(' function_args_commalist ')' - { - if ( $3->count() == 1 || $3->count() == 2 ) - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - else - YYERROR; - } - | function_name23 '(' function_args_commalist ')' - { - if ( $3->count() == 2 || $3->count() == 3) - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - else - YYERROR; - } - ; -function_name0: - date_function_0Argument - | numeric_function_0Argument - ; -function_name1: - string_function_1Argument - | date_function_1Argument - | numeric_function_1Argument - ; -function_name2: - string_function_2Argument - | numeric_function_2Argument - ; -function_name12: - SQL_TOKEN_ROUND - | SQL_TOKEN_WEEK - | SQL_TOKEN_LOGF - | SQL_TOKEN_LOG - ; -function_name23: - SQL_TOKEN_LOCATE - | SQL_TOKEN_DATEDIFF - ; -function_name3: - string_function_3Argument - ; -function_name: - string_function - | date_function - | numeric_function - | SQL_TOKEN_NAME - ; -string_function_1Argument: - SQL_TOKEN_LENGTH - | SQL_TOKEN_ASCII - | SQL_TOKEN_LCASE - | SQL_TOKEN_LTRIM - | SQL_TOKEN_RTRIM - | SQL_TOKEN_SPACE - | SQL_TOKEN_UCASE - ; - -string_function_2Argument: - SQL_TOKEN_REPEAT - | SQL_TOKEN_LEFT - | SQL_TOKEN_RIGHT - ; -string_function_3Argument: - SQL_TOKEN_REPLACE - ; -string_function_4Argument: - SQL_TOKEN_INSERT - ; - -string_function: - SQL_TOKEN_CHAR - | SQL_TOKEN_CONCAT - | SQL_TOKEN_DIFFERENCE - | SQL_TOKEN_LOCATE_2 - | SQL_TOKEN_SOUNDEX - ; -date_function_0Argument: - SQL_TOKEN_CURDATE - | SQL_TOKEN_CURTIME - | SQL_TOKEN_NOW - ; -date_function_1Argument: - SQL_TOKEN_DAYOFWEEK - | SQL_TOKEN_DAYOFMONTH - | SQL_TOKEN_DAYOFYEAR - | SQL_TOKEN_MONTH - | SQL_TOKEN_DAYNAME - | SQL_TOKEN_MONTHNAME - | SQL_TOKEN_QUARTER - | SQL_TOKEN_HOUR - | SQL_TOKEN_MINUTE - | SQL_TOKEN_SECOND - | SQL_TOKEN_YEAR - | SQL_TOKEN_DAY - | SQL_TOKEN_TIMEVALUE - | SQL_TOKEN_DATEVALUE - ; - -date_function: - SQL_TOKEN_TIMESTAMPADD - | SQL_TOKEN_TIMESTAMPDIFF - ; -numeric_function_0Argument: - SQL_TOKEN_PI - ; -numeric_function_1Argument: - SQL_TOKEN_ABS - | SQL_TOKEN_ACOS - | SQL_TOKEN_ASIN - | SQL_TOKEN_ATAN - | SQL_TOKEN_CEILING - | SQL_TOKEN_COS - | SQL_TOKEN_COT - | SQL_TOKEN_DEGREES - | SQL_TOKEN_FLOOR - | SQL_TOKEN_SIGN - | SQL_TOKEN_SIN - | SQL_TOKEN_SQRT - | SQL_TOKEN_TAN - | SQL_TOKEN_EXP - | SQL_TOKEN_LOG10 - | SQL_TOKEN_LN - | SQL_TOKEN_RADIANS - | SQL_TOKEN_ROUNDMAGIC - ; -numeric_function_2Argument: - SQL_TOKEN_ATAN2 - | SQL_TOKEN_MOD - | SQL_TOKEN_POWER - ; -numeric_function: - SQL_TOKEN_RAND - | SQL_TOKEN_TRUNCATE - ; - -window_function: - window_function_type SQL_TOKEN_OVER window_name_or_specification - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -window_function_type : - rank_function_type '(' ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | SQL_TOKEN_ROW_NUMBER '(' ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | general_set_fct - | ntile_function - | lead_or_lag_function - | first_or_last_value_function - | nth_value_function -; -ntile_function : - SQL_TOKEN_NTILE '(' number_of_tiles ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -dynamic_parameter_specification: - parameter - ; -simple_value_specification: - literal - ; -number_of_tiles : - simple_value_specification - | dynamic_parameter_specification - ; -opt_lead_or_lag_function: - /* empty */ {$$ = SQL_NEW_RULE;} - | ',' offset - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode(",", SQL_NODE_PUNCTUATION)); - $$->append($2); - } - | ',' offset ',' default_expression - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode(",", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(",", SQL_NODE_PUNCTUATION)); - $$->append($4); - } - ; -opt_null_treatment: - /* empty */ {$$ = SQL_NEW_RULE;} - | null_treatment - ; - -lead_or_lag_function: - lead_or_lag '(' lead_or_lag_extent opt_lead_or_lag_function ')' opt_null_treatment - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4); - $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION)); - $$->append($6); - } - ; -lead_or_lag: - SQL_TOKEN_LEAD - | SQL_TOKEN_LAG - ; -lead_or_lag_extent: - value_exp - ; -offset: - SQL_TOKEN_INTNUM - ; -default_expression: - value_exp - ; -null_treatment: - SQL_TOKEN_RESPECT SQL_TOKEN_NULLS - | SQL_TOKEN_IGNORE SQL_TOKEN_NULLS - ; -first_or_last_value_function: - first_or_last_value '(' value_exp ')' opt_null_treatment - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - $$->append($5); - } - ; -first_or_last_value : - SQL_TOKEN_FIRST_VALUE - | SQL_TOKEN_LAST_VALUE - ; -opt_from_first_or_last: - /* empty */ {$$ = SQL_NEW_RULE;} - | from_first_or_last - ; -nth_value_function: - SQL_TOKEN_NTH_VALUE '(' value_exp ',' nth_row ')' opt_from_first_or_last opt_null_treatment - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(",", SQL_NODE_PUNCTUATION)); - $$->append($5); - $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION)); - $$->append($7); - $$->append($8); - } - ; -nth_row: - simple_value_specification - | dynamic_parameter_specification - ; -from_first_or_last: - SQL_TOKEN_FROM SQL_TOKEN_FIRST - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_FROM SQL_TOKEN_LAST - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -window_name: - SQL_TOKEN_NAME - ; -window_name_or_specification: - window_name - | in_line_window_specification - ; -in_line_window_specification: - window_specification - ; -opt_window_clause: - /* empty */ {$$ = SQL_NEW_RULE;} - | window_clause - ; -window_clause: - SQL_TOKEN_WINDOW window_definition_list - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -window_definition_list: - window_definition_list ',' window_definition - {$1->append($3); - $$ = $1;} - | window_definition - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - ; -window_definition: - new_window_name SQL_TOKEN_AS window_specification - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -new_window_name: - window_name - ; -window_specification: - '(' window_specification_details ')' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -opt_existing_window_name: - /* empty */ {$$ = SQL_NEW_RULE;} - | existing_window_name - ; -opt_window_partition_clause: - /* empty */ {$$ = SQL_NEW_RULE;} - | window_partition_clause - ; -opt_window_frame_clause: - /* empty */ {$$ = SQL_NEW_RULE;} - | window_frame_clause - ; -window_specification_details: - opt_existing_window_name - opt_window_partition_clause - opt_order_by_clause - opt_window_frame_clause - ; -existing_window_name: - window_name - ; -window_partition_clause: - SQL_TOKEN_PARTITION SQL_TOKEN_BY window_partition_column_reference_list - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -window_partition_column_reference_list: - window_partition_column_reference_list ',' window_partition_column_reference - {$1->append($3); - $$ = $1;} - | window_partition_column_reference - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - ; -window_partition_column_reference: - column_ref opt_collate_clause - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -opt_window_frame_exclusion: - /* empty */ {$$ = SQL_NEW_RULE;} - | window_frame_exclusion - ; -window_frame_clause: - window_frame_units window_frame_extent opt_window_frame_exclusion - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -window_frame_units: - SQL_TOKEN_ROWS - | SQL_TOKEN_RANGE - ; -window_frame_extent: - window_frame_start - | window_frame_between - ; -window_frame_start: - SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | window_frame_preceding - | SQL_TOKEN_CURRENT SQL_TOKEN_ROW - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -window_frame_preceding: - unsigned_value_spec SQL_TOKEN_PRECEDING - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -window_frame_between: - SQL_TOKEN_BETWEEN window_frame_bound_1 SQL_TOKEN_AND window_frame_bound_2 - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; -window_frame_bound_1: - window_frame_bound - ; -window_frame_bound_2: - window_frame_bound - ; -window_frame_bound: - window_frame_start - | SQL_TOKEN_UNBOUNDED SQL_TOKEN_FOLLOWING - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | window_frame_following - ; -window_frame_following: - unsigned_value_spec SQL_TOKEN_FOLLOWING - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -window_frame_exclusion: - SQL_TOKEN_EXCLUDE SQL_TOKEN_CURRENT SQL_TOKEN_ROW - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | SQL_TOKEN_EXCLUDE SQL_TOKEN_GROUP - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_EXCLUDE SQL_TOKEN_TIES - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_EXCLUDE SQL_TOKEN_NO SQL_TOKEN_OTHERS - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -op_parameter: - {$$ = SQL_NEW_RULE;} - | '?' SQL_EQUAL - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("?", SQL_NODE_PUNCTUATION)); - $$->append($2); - } - ; -odbc_call_spec: - op_parameter SQL_TOKEN_CALL table_node op_odbc_call_parameter - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; - -op_odbc_call_parameter: - {$$ = SQL_NEW_RULE;} - | '(' odbc_parameter_commalist ')' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; - -odbc_parameter_commalist: - odbc_parameter - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | odbc_parameter_commalist ',' odbc_parameter - { - $1->append($3); - $$ = $1; - } - ; -odbc_parameter: - /* empty */ {$$ = SQL_NEW_RULE;} - | literal - | parameter - ; - -odbc_fct_spec: - odbc_fct_type SQL_TOKEN_STRING - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_FN set_fct_spec - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; - -odbc_fct_type: - SQL_TOKEN_D - | SQL_TOKEN_T - | SQL_TOKEN_TS - ; - -general_set_fct: - set_fct_type '(' opt_all_distinct function_arg ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4); - $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | SQL_TOKEN_COUNT '(' '*' ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3 = newNode("*", SQL_NODE_PUNCTUATION)); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | SQL_TOKEN_COUNT '(' opt_all_distinct function_arg ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4); - $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | ordered_set_function - | array_aggregate_function - ; -set_fct_type: - SQL_TOKEN_AVG - | SQL_TOKEN_MAX - | SQL_TOKEN_MIN - | SQL_TOKEN_SUM - | SQL_TOKEN_EVERY - | SQL_TOKEN_ANY - | SQL_TOKEN_SOME - | SQL_TOKEN_STDDEV_POP - | SQL_TOKEN_STDDEV_SAMP - | SQL_TOKEN_VAR_SAMP - | SQL_TOKEN_VAR_POP - | SQL_TOKEN_COLLECT - | SQL_TOKEN_FUSION - | SQL_TOKEN_INTERSECTION - ; - -ordered_set_function: - hypothetical_set_function - | inverse_distribution_function - ; -hypothetical_set_function: - rank_function_type '(' hypothetical_set_function_value_expression_list ')' within_group_specification - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - $$->append($5); - } - | rank_function_type '(' hypothetical_set_function_value_expression_list SQL_TOKEN_BY value_exp_commalist ')' within_group_specification - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION)); - $$->append($7); - } - ; - -within_group_specification: - { - $$ = SQL_NEW_RULE; - } - | SQL_TOKEN_WITHIN SQL_TOKEN_GROUP '(' opt_order_by_clause ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($4); - $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -hypothetical_set_function_value_expression_list: - value_exp_commalist - ; - -inverse_distribution_function: - inverse_distribution_function_type '('inverse_distribution_function_argument ')' within_group_specification - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -inverse_distribution_function_argument: - num_value_exp - ; -inverse_distribution_function_type: - SQL_TOKEN_PERCENTILE_CONT - | SQL_TOKEN_PERCENTILE_DISC - ; - -array_aggregate_function: - SQL_TOKEN_ARRAY_AGG '(' value_exp opt_order_by_clause ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4); - $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; - -rank_function_type: - SQL_TOKEN_RANK - | SQL_TOKEN_DENSE_RANK - | SQL_TOKEN_PERCENT_RANK - | SQL_TOKEN_CUME_DIST - ; -outer_join_type: - SQL_TOKEN_LEFT %prec SQL_TOKEN_LEFT - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | SQL_TOKEN_RIGHT %prec SQL_TOKEN_RIGHT - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | SQL_TOKEN_FULL %prec SQL_TOKEN_FULL - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -join_condition: - SQL_TOKEN_ON search_condition - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -join_spec: - join_condition - | named_columns_join - ; -join_type: - /* empty */ {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_INNER - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | outer_join_type - | outer_join_type SQL_TOKEN_OUTER - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -cross_union: - table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; - -qualified_join: - /* wenn SQL_TOKEN_NATURAL, dann keine join_spec */ - table_ref SQL_TOKEN_NATURAL join_type SQL_TOKEN_JOIN table_ref - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - } - | table_ref join_type SQL_TOKEN_JOIN table_ref join_spec - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - } - | cross_union - ; -joined_table: - qualified_join - ; -named_columns_join: - SQL_TOKEN_USING '(' column_commalist ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -simple_table: - select_statement - | values_or_query_spec - ; - -non_join_query_primary: - simple_table - | '(' non_join_query_exp ')' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -non_join_query_term: - non_join_query_primary - | query_term SQL_TOKEN_INTERSECT all query_primary - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; -query_primary: - non_join_query_primary - ; -non_join_query_exp: - non_join_query_term - | query_exp SQL_TOKEN_UNION all query_term - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - | query_exp SQL_TOKEN_EXCEPT all query_term - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; -all: - /* empty*/ {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_ALL - ; -query_exp: - non_join_query_exp /*[^')']*/ - ; -scalar_subquery: - subquery - ; -cast_operand: - value_exp - ; -cast_target: - table_node - | data_type - ; -cast_spec: - SQL_TOKEN_CAST '(' cast_operand SQL_TOKEN_AS cast_target ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -value_exp_primary: - unsigned_value_spec - | column_ref - | set_fct_spec - | scalar_subquery - | case_expression - | window_function - | '(' value_exp ')' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | cast_spec - ; - -num_primary: - value_exp_primary - | num_value_fct - ; -factor: - num_primary - | '-' num_primary %prec SQL_TOKEN_UMINUS - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("-", SQL_NODE_PUNCTUATION)); - $$->append($2); - } - | '+' num_primary %prec SQL_TOKEN_UMINUS - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("+", SQL_NODE_PUNCTUATION)); - $$->append($2); - } - ; - -term: - factor - | term '*' factor - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("*", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - | term '/' factor - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("/", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - ; - -num_value_exp: - term - | num_value_exp '+' term - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - | num_value_exp '-' term - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("-", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - ; -datetime_primary: -/* value_exp_primary - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - |*/ datetime_value_fct - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -datetime_value_fct: - SQL_TOKEN_CURRENT_DATE - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | SQL_TOKEN_CURRENT_TIME - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | SQL_TOKEN_CURRENT_TIMESTAMP - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -time_zone: - SQL_TOKEN_AT time_zone_specifier - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -time_zone_specifier: - SQL_TOKEN_LOCAL - { - $$ = SQL_NEW_RULE; - $$->append($1); - } -/* | SQL_TOKEN_TIME SQL_TOKEN_ZONE interval_value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - }*/ - ; -datetime_factor: - datetime_primary - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | datetime_primary time_zone - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -datetime_term: - datetime_factor - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -/* -interval_term: - literal - | interval_term '*' factor - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("*", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - | interval_term '/' factor - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("/", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - ; -*/ -datetime_value_exp: - datetime_term - { - $$ = SQL_NEW_RULE; - $$->append($1); - } -/* | interval_value_exp '+' datetime_term - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - | datetime_value_exp '+' interval_term - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - | datetime_value_exp '-' interval_term - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("-", SQL_NODE_PUNCTUATION)); - $$->append($3); - } -*/ ; -/* -interval_value_exp: - interval_term - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | interval_value_exp '+' interval_term - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - | interval_value_exp '-' interval_term - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("-", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - | '(' datetime_value_exp '-' datetime_term ')' interval_qualifier - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode("-", SQL_NODE_PUNCTUATION)); - $$->append($4); - $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION)); - $$->append($6); - } - ; -*/ -non_second_datetime_field: - SQL_TOKEN_YEAR - | SQL_TOKEN_MONTH - | SQL_TOKEN_DAY - | SQL_TOKEN_HOUR - | SQL_TOKEN_MINUTE - ; -start_field: - non_second_datetime_field opt_paren_precision - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -end_field: - non_second_datetime_field - | SQL_TOKEN_SECOND opt_paren_precision - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; - -single_datetime_field: - non_second_datetime_field opt_paren_precision - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_SECOND opt_paren_precision_scale - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; - -interval_qualifier: - start_field SQL_TOKEN_TO end_field - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | single_datetime_field - ; - -function_arg_commalist2: - function_arg ',' function_arg - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1); - $$->append($3);} - ; -function_arg_commalist3: - function_arg ',' function_arg ',' function_arg - { - $$ = SQL_NEW_COMMALISTRULE; - $$->append($1); - $$->append($3); - $$->append($5); - } - ; -function_arg_commalist4: - function_arg ',' function_arg ',' function_arg ',' function_arg - { - $$ = SQL_NEW_COMMALISTRULE; - $$->append($1); - $$->append($3); - $$->append($5); - $$->append($7); - } - ; -value_exp_commalist: - value_exp - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | value_exp_commalist ',' value_exp - {$1->append($3); - $$ = $1;} - /* this rule is only valid if we check predicates */ - | value_exp_commalist ';' value_exp - { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) - { - $1->append($3); - $$ = $1; - } - else - YYERROR; - } - ; -function_arg: - result - | value_exp comparison value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | value_exp SQL_TOKEN_USING value_exp comparison value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - | value_exp SQL_TOKEN_BY value_exp_commalist - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -function_args_commalist: - function_arg - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | function_args_commalist ',' function_arg - {$1->append($3); - $$ = $1;} - /* this rule is only valid if we check predicates */ - | function_args_commalist ';' function_arg - { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) - { - $1->append($3); - $$ = $1; - } - else - YYERROR; - } - ; - -value_exp: - num_value_exp /*[^')']*/ - | string_value_exp - | datetime_value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -string_value_exp: - char_value_exp -/* | bit_value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - } -*/ ; -char_value_exp: - char_factor - | concatenation - ; -concatenation: - char_value_exp '+' char_factor - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - | value_exp SQL_CONCAT value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; - -char_primary: - SQL_TOKEN_STRING - | string_value_fct - ; -collate_clause: - SQL_TOKEN_COLLATE table_node - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -char_factor: - char_primary - | char_primary collate_clause - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -string_value_fct: - char_value_fct - | bit_value_fct - ; -bit_value_fct: - bit_substring_fct - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -bit_substring_fct: - SQL_TOKEN_SUBSTRING '(' bit_value_exp SQL_TOKEN_FROM string_value_exp for_length ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6); - $$->append($7 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -bit_value_exp: - bit_factor - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -/* - bit_concatenation - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | -bit_concatenation: - bit_value_exp '+' bit_factor - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - ; -*/ -bit_factor: - bit_primary - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -bit_primary: - {$$ = SQL_NEW_RULE;} -/* value_exp_primary - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | string_value_fct - { - $$ = SQL_NEW_RULE; - $$->append($1); - }*/ - ; -char_value_fct: - char_substring_fct - | fold - | form_conversion - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | char_translation - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - | trim_fct - { - $$ = SQL_NEW_RULE; - $$->append($1); - } - ; -for_length: - {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_FOR value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -char_substring_fct: - SQL_TOKEN_SUBSTRING '(' value_exp SQL_TOKEN_FROM value_exp for_length ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6); - $$->append($7 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | SQL_TOKEN_SUBSTRING '(' value_exp_commalist ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -upper_lower: - SQL_TOKEN_UPPER - | SQL_TOKEN_LOWER - ; -fold: - upper_lower '(' value_exp ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -form_conversion: - SQL_TOKEN_CONVERT '(' string_value_exp SQL_TOKEN_USING table_node ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | SQL_TOKEN_CONVERT '(' cast_operand ',' cast_target ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($2 = newNode(",", SQL_NODE_PUNCTUATION)); - $$->append($5); - $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -char_translation: - SQL_TOKEN_TRANSLATE '(' string_value_exp SQL_TOKEN_USING table_node ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -trim_fct: - SQL_TOKEN_TRIM '(' trim_operands ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -trim_operands: - trim_spec value_exp SQL_TOKEN_FROM value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - | trim_spec SQL_TOKEN_FROM value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | value_exp SQL_TOKEN_FROM value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | SQL_TOKEN_FROM value_exp - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | value_exp - ; - -trim_spec: - SQL_TOKEN_BOTH - | SQL_TOKEN_LEADING - | SQL_TOKEN_TRAILING - ; - -derived_column: - value_exp as_clause - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -/* Tabellenname */ -table_node: - table_name - | schema_name - | catalog_name -; -catalog_name: - SQL_TOKEN_NAME '.' schema_name - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - | SQL_TOKEN_NAME ':' schema_name - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode(":", SQL_NODE_PUNCTUATION)); - $$->append($3); - } -; -schema_name: - SQL_TOKEN_NAME '.' table_name - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($3); - } -; - -table_name: - SQL_TOKEN_NAME - {$$ = SQL_NEW_RULE; - $$->append($1);} -; -/* Columns */ -column_ref: - column - {$$ = SQL_NEW_RULE; - $$->append($1);} -/* | table_node '.' column_val %prec '.' - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($3);} -*/ - | SQL_TOKEN_NAME '.' column_val %prec '.' - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($3); - } - | SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val %prec '.' - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($5);} - | SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val %prec '.' - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2= newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($5); - $$->append($6 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($7); - } - | SQL_TOKEN_NAME ':' SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val %prec '.' - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2= newNode(":", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($5); - $$->append($6 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($7); - } -/* | SQL_TOKEN_NAME ';' SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2= newNode(";", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($5); - $$->append($6 = newNode(".", SQL_NODE_PUNCTUATION)); - $$->append($7); - } -*/ ; - - /* data types */ -column_val: - column - {$$ = SQL_NEW_RULE; - $$->append($1);} - | '*' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("*", SQL_NODE_PUNCTUATION)); - } - ; -data_type: - predefined_type - ; -opt_char_set_spec: - {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_CHARACTER SQL_TOKEN_SET SQL_TOKEN_NAME - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -opt_collate_clause: - {$$ = SQL_NEW_RULE;} - | collate_clause - ; -predefined_type: - character_string_type opt_char_set_spec opt_collate_clause - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | national_character_string_type opt_collate_clause - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | binary_string_type - | numeric_type - | boolean_type - | datetime_type - | interval_type - ; -character_string_type: - SQL_TOKEN_CHARACTER opt_paren_precision - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_CHAR opt_paren_precision - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_CHARACTER SQL_TOKEN_VARYING paren_char_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | SQL_TOKEN_CHAR SQL_TOKEN_VARYING paren_char_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | SQL_TOKEN_VARCHAR paren_char_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | character_large_object_type - ; -opt_paren_precision: - {$$ = SQL_NEW_RULE;} - | paren_char_length - ; -paren_char_length: - '(' SQL_TOKEN_INTNUM ')' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -opt_paren_char_large_length: - {$$ = SQL_NEW_RULE;} - | paren_character_large_object_length - ; -paren_character_large_object_length: - '(' large_object_length ')' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; - -large_object_length: - SQL_TOKEN_INTNUM opt_multiplier - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -opt_multiplier: - {$$ = SQL_NEW_RULE;} - | 'K' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("K", SQL_NODE_PUNCTUATION)); - } - | 'M' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("M", SQL_NODE_PUNCTUATION)); - } - | 'G' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("G", SQL_NODE_PUNCTUATION)); - } - | 'T' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("T", SQL_NODE_PUNCTUATION)); - } - | 'P' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("P", SQL_NODE_PUNCTUATION)); - } - ; -character_large_object_type: - SQL_TOKEN_CHARACTER SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - | SQL_TOKEN_CHAR SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - | SQL_TOKEN_CLOB opt_paren_char_large_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -national_character_string_type: - SQL_TOKEN_NATIONAL SQL_TOKEN_CHARACTER opt_paren_precision - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | SQL_TOKEN_NATIONAL SQL_TOKEN_CHAR opt_paren_precision - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | SQL_TOKEN_NCHAR opt_paren_precision - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_NATIONAL SQL_TOKEN_CHARACTER SQL_TOKEN_VARYING paren_char_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - | SQL_TOKEN_NATIONAL SQL_TOKEN_CHAR SQL_TOKEN_VARYING paren_char_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - | SQL_TOKEN_NCHAR SQL_TOKEN_VARYING paren_char_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | national_character_large_object_type - ; -national_character_large_object_type: - SQL_TOKEN_NATIONAL SQL_TOKEN_CHARACTER SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - } - | SQL_TOKEN_NCHAR SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - | SQL_TOKEN_NCLOB opt_paren_char_large_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -binary_string_type: - SQL_TOKEN_BINARY opt_paren_precision - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_BINARY SQL_TOKEN_VARYING paren_char_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | SQL_TOKEN_VARBINARY paren_char_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | binary_large_object_string_type - ; -binary_large_object_string_type: - SQL_TOKEN_BINARY SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - | SQL_TOKEN_BLOB opt_paren_char_large_length - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -numeric_type: - exact_numeric_type - | approximate_numeric_type - ; -opt_paren_precision_scale: - {$$ = SQL_NEW_RULE;} - | '(' SQL_TOKEN_INTNUM ')' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | '(' SQL_TOKEN_INTNUM ',' SQL_TOKEN_INTNUM ')' - { - $$ = SQL_NEW_RULE; - $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode(",", SQL_NODE_PUNCTUATION)); - $$->append($4); - $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -exact_numeric_type: - SQL_TOKEN_NUMERIC opt_paren_precision_scale - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_DECIMAL opt_paren_precision_scale - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_DEC opt_paren_precision_scale - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - | SQL_TOKEN_SMALLINT - | SQL_TOKEN_INTEGER - | SQL_TOKEN_INT - | SQL_TOKEN_BIGINT - ; -approximate_numeric_type: - SQL_TOKEN_FLOAT '(' SQL_TOKEN_INTNUM ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | SQL_TOKEN_FLOAT - | SQL_TOKEN_REAL - | SQL_TOKEN_DOUBLE - | SQL_TOKEN_DOUBLE SQL_TOKEN_PRECISION - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -boolean_type: - SQL_TOKEN_BOOLEAN -; -datetime_type: - SQL_TOKEN_DATE - | SQL_TOKEN_TIME opt_paren_precision opt_with_or_without_time_zone - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | SQL_TOKEN_TIMESTAMP opt_paren_precision opt_with_or_without_time_zone - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -opt_with_or_without_time_zone: - {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_WITH SQL_TOKEN_TIME SQL_TOKEN_ZONE - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - | SQL_TOKEN_WITHOUT SQL_TOKEN_TIME SQL_TOKEN_ZONE - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -interval_type: - SQL_TOKEN_INTERVAL interval_qualifier - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; - /* the various things you can name */ - -column: - SQL_TOKEN_NAME - | SQL_TOKEN_POSITION - { - sal_uInt32 nNod = $$->getRuleID(); - delete $$; - $$ = newNode(xxx_pGLOBAL_SQLPARSER->TokenIDToStr(nNod), SQL_NODE_NAME); - } - | SQL_TOKEN_CHAR_LENGTH - { - sal_uInt32 nNod = $$->getRuleID(); - delete $$; - $$ = newNode(xxx_pGLOBAL_SQLPARSER->TokenIDToStr(nNod), SQL_NODE_NAME); - } - | SQL_TOKEN_EXTRACT - { - sal_uInt32 nNod = $$->getRuleID(); - delete $$; - $$ = newNode(xxx_pGLOBAL_SQLPARSER->TokenIDToStr(nNod), SQL_NODE_NAME); - } - ; -case_expression: - case_abbreviation - | case_specification - ; -case_abbreviation: - SQL_TOKEN_NULLIF '(' value_exp_commalist ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | SQL_TOKEN_COALESCE '(' value_exp ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - | SQL_TOKEN_COALESCE '(' value_exp_commalist ')' - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); - $$->append($3); - $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); - } - ; -case_specification: - simple_case - | searched_case - ; -simple_case: - SQL_TOKEN_CASE case_operand simple_when_clause_list else_clause SQL_TOKEN_END - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - } - ; -searched_case: - SQL_TOKEN_CASE searched_when_clause_list else_clause SQL_TOKEN_END - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; -simple_when_clause_list: - simple_when_clause - { - $$ = SQL_NEW_LISTRULE; - $$->append($1); - } - | searched_when_clause_list simple_when_clause - { - $1->append($2); - $$ = $1; - } - ; -simple_when_clause: - SQL_TOKEN_WHEN when_operand_list SQL_TOKEN_THEN result - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; -when_operand_list: - when_operand - {$$ = SQL_NEW_COMMALISTRULE; - $$->append($1);} - | when_operand_list ',' when_operand - {$1->append($3); - $$ = $1;} - ; -when_operand: - row_value_constructor_elem - | comparison_predicate_part_2 - | between_predicate_part_2 - | in_predicate_part_2 - | character_like_predicate_part_2 - | null_predicate_part_2 -; -searched_when_clause_list: - searched_when_clause - { - $$ = SQL_NEW_LISTRULE; - $$->append($1); - } - | searched_when_clause_list searched_when_clause - { - $1->append($2); - $$ = $1; - } - ; -searched_when_clause: - SQL_TOKEN_WHEN search_condition SQL_TOKEN_THEN result - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; -else_clause: - {$$ = SQL_NEW_RULE;} - | SQL_TOKEN_ELSE result - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -result: - result_expression - | SQL_TOKEN_NULL - ; -result_expression: - value_exp - ; -case_operand: - row_value_constructor_elem - ; - -cursor: SQL_TOKEN_NAME - {$$ = SQL_NEW_RULE; - $$->append($1);} - ; - -/*** -module: SQL_TOKEN_NAME - {$$ = SQL_NEW_RULE; - $$->append($1);} - ; -***/ - -parameter: - ':' SQL_TOKEN_NAME - {$$ = SQL_NEW_RULE; - $$->append($1 = newNode(":", SQL_NODE_PUNCTUATION)); - $$->append($2);} - | '?' - {$$ = SQL_NEW_RULE; // test - $$->append($1 = newNode("?", SQL_NODE_PUNCTUATION));} - | '[' SQL_TOKEN_NAME ']' - {$$ = SQL_NEW_RULE; - $$->append($1 = newNode("[", SQL_NODE_PUNCTUATION)); - $$->append($2); - $$->append($3 = newNode("]", SQL_NODE_PUNCTUATION));} - ; - -/*** -procedure: SQL_TOKEN_NAME - {$$ = SQL_NEW_RULE; - $$->append($1);} - ; -***/ - -range_variable: - {$$ = SQL_NEW_RULE;} - | opt_as SQL_TOKEN_NAME - {$$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; - -user: SQL_TOKEN_NAME - ; - -/* PREDICATECHECK RULES */ -sql: - search_condition /* checking predicats */ - { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // sql: rule 1 - { - $$ = $1; - if ( SQL_ISRULE($$,search_condition) ) - { - $$->insert(0,newNode("(", SQL_NODE_PUNCTUATION)); - $$->append(newNode(")", SQL_NODE_PUNCTUATION)); - } - } - else - YYERROR; - } - | '(' sql ')' /* checking predicats */ - ; -trigger_definition: - SQL_TOKEN_CREATE SQL_TOKEN_TRIGGER trigger_name trigger_action_time trigger_event SQL_TOKEN_ON table_name op_referencing triggered_action - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); - $$->append($6); - $$->append($7); - $$->append($8); - $$->append($9); - } - ; -op_referencing: - { - $$ = SQL_NEW_RULE; - } - | SQL_TOKEN_REFERENCING transition_table_or_variable_list - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -trigger_action_time: - SQL_TOKEN_BEFORE - | SQL_TOKEN_AFTER - | SQL_TOKEN_INSTEAD SQL_TOKEN_OF - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } -; -trigger_event: - SQL_TOKEN_INSERT - | SQL_TOKEN_DELETE - | SQL_TOKEN_UPDATE op_trigger_columnlist - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -op_trigger_columnlist: - { - $$ = SQL_NEW_RULE; - } - | SQL_TOKEN_OF trigger_column_list - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -trigger_column_list: - column_commalist - ; -triggered_action: - op_triggered_action_for triggered_when_clause triggered_SQL_statement - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -op_triggered_action_for: - { - $$ = SQL_NEW_RULE; - } - | SQL_TOKEN_FOR SQL_TOKEN_EACH trigger_for - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } - ; -trigger_for: - SQL_TOKEN_ROW - | SQL_TOKEN_STATEMENT - ; -triggered_when_clause: - { - $$ = SQL_NEW_RULE; - } - | SQL_TOKEN_WHEN parenthesized_boolean_value_expression - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -triggered_SQL_statement: - SQL_procedure_statement - | SQL_TOKEN_BEGIN SQL_TOKEN_ATOMIC SQL_procedure_statement_list ';' SQL_TOKEN_END - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4 = newNode(";", SQL_NODE_PUNCTUATION)); - $$->append($5); - } - ; -SQL_procedure_statement_list: - SQL_procedure_statement - { - $$ = SQL_NEW_LISTRULE; - $$->append($1); - } - | SQL_procedure_statement_list ';' SQL_procedure_statement - { - $1->append($3); - $$ = $1; - } - ; -SQL_procedure_statement: - sql - ; - -transition_table_or_variable_list: - transition_table_or_variable - { - $$ = SQL_NEW_LISTRULE; - $$->append($1); - } - | transition_table_or_variable_list transition_table_or_variable - { - $1->append($2); - $$ = $1; - } - ; - -transition_table_or_variable: - SQL_TOKEN_OLD opt_row opt_as old_transition_variable_name - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - | SQL_TOKEN_NEW opt_row opt_as new_transition_variable_name - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - | SQL_TOKEN_OLD SQL_TOKEN_TABLE opt_as old_transition_table_name - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - | SQL_TOKEN_NEW SQL_TOKEN_TABLE opt_as new_transition_table_name - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } -; -old_transition_table_name: - transition_table_name -; -new_transition_table_name: - transition_table_name -; -transition_table_name: - SQL_TOKEN_NAME -; -old_transition_variable_name: - SQL_TOKEN_NAME -; -new_transition_variable_name: - SQL_TOKEN_NAME -; -trigger_name: - SQL_TOKEN_NAME -; -%% - - -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::i18n; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::util; -using namespace ::osl; -using namespace ::dbtools; - -//============================================================ -//= a helper for static ascii pseudo-unicode strings -//============================================================ -// string constants -struct _ConstAsciiString_ -{ - sal_Int32 length; - sal_Char const* str; - - operator rtl::OUString () const { return rtl::OUString(str, length, RTL_TEXTENCODING_ASCII_US); } - operator const sal_Char * () const { return str; } - operator ::rtl::OString() const { return str; } -}; - -#define IMPLEMENT_CONSTASCII_STRING( name, string ) \ - _ConstAsciiString_ const name = { sizeof(string)-1, string } - -IMPLEMENT_CONSTASCII_STRING(ERROR_STR_GENERAL, "Syntax error in SQL expression"); -IMPLEMENT_CONSTASCII_STRING(ERROR_STR_VALUE_NO_LIKE, "The value #1 can not be used with LIKE."); -IMPLEMENT_CONSTASCII_STRING(ERROR_STR_FIELD_NO_LIKE, "LIKE can not be used with this field."); -IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_COMPARE, "The entered criterion can not be compared with this field."); -IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_DATE_COMPARE, "The field can not be compared with a date."); -IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_REAL_COMPARE, "The field can not be compared with a floating point number."); -IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_INT_COMPARE, "The field can not be compared with a number."); -IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_TABLE, "The database does not contain a table named \"#\"."); -IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_TABLE_OR_QUERY, "The database does contain neither a table nor a query named \"#\"."); -IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_COLUMN, "The column \"#1\" is unknown in the table \"#2\"."); -IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_TABLE_EXIST, "The database already contains a table or view with name \"#\"."); -IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_QUERY_EXIST, "The database already contains a query with name \"#\"."); - -IMPLEMENT_CONSTASCII_STRING(KEY_STR_LIKE, "LIKE"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_NOT, "NOT"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_NULL, "NULL"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_TRUE, "True"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_FALSE, "False"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_IS, "IS"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_BETWEEN, "BETWEEN"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_OR, "OR"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_AND, "AND"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_AVG, "AVG"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_COUNT, "COUNT"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_MAX, "MAX"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_MIN, "MIN"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_SUM, "SUM"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_EVERY, "EVERY"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_ANY, "ANY"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_SOME, "SOME"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_STDDEV_POP, "STDDEV_POP"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_STDDEV_SAMP, "STDDEV_SAMP"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_VAR_SAMP, "VAR_SAMP"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_VAR_POP, "VAR_POP"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_COLLECT, "COLLECT"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_FUSION, "FUSION"); -IMPLEMENT_CONSTASCII_STRING(KEY_STR_INTERSECTION, "INTERSECTION"); - -IMPLEMENT_CONSTASCII_STRING(FIELD_STR_NULLDATE, "NullDate"); - -IMPLEMENT_CONSTASCII_STRING(STR_SQL_TOKEN, "SQL_TOKEN_"); - -//========================================================================== -//= OParseContext -//========================================================================== -//----------------------------------------------------------------------------- -OParseContext::OParseContext() -{ -} - -//----------------------------------------------------------------------------- -OParseContext::~OParseContext() -{ -} - -//----------------------------------------------------------------------------- -::rtl::OUString OParseContext::getErrorMessage(ErrorCode _eCode) const -{ - ::rtl::OUString aMsg; - switch (_eCode) - { - case ERROR_GENERAL: aMsg = ERROR_STR_GENERAL; break; - case ERROR_VALUE_NO_LIKE: aMsg = ERROR_STR_VALUE_NO_LIKE; break; - case ERROR_FIELD_NO_LIKE: aMsg = ERROR_STR_FIELD_NO_LIKE; break; - case ERROR_INVALID_COMPARE: aMsg = ERROR_STR_INVALID_COMPARE; break; - case ERROR_INVALID_INT_COMPARE: aMsg = ERROR_STR_INVALID_INT_COMPARE; break; - case ERROR_INVALID_DATE_COMPARE: aMsg = ERROR_STR_INVALID_DATE_COMPARE; break; - case ERROR_INVALID_REAL_COMPARE: aMsg = ERROR_STR_INVALID_REAL_COMPARE; break; - case ERROR_INVALID_TABLE: aMsg = ERROR_STR_INVALID_TABLE; break; - case ERROR_INVALID_TABLE_OR_QUERY: aMsg = ERROR_STR_INVALID_TABLE_OR_QUERY; break; - case ERROR_INVALID_COLUMN: aMsg = ERROR_STR_INVALID_COLUMN; break; - case ERROR_INVALID_TABLE_EXIST: aMsg = ERROR_STR_INVALID_TABLE_EXIST; break; - case ERROR_INVALID_QUERY_EXIST: aMsg = ERROR_STR_INVALID_QUERY_EXIST; break; - default: - OSL_FAIL( "OParseContext::getErrorMessage: unknown error code!" ); - break; - } - return aMsg; -} - -//----------------------------------------------------------------------------- -::rtl::OString OParseContext::getIntlKeywordAscii(InternationalKeyCode _eKey) const -{ - ::rtl::OString aKeyword; - switch (_eKey) - { - case KEY_LIKE: aKeyword = KEY_STR_LIKE; break; - case KEY_NOT: aKeyword = KEY_STR_NOT; break; - case KEY_NULL: aKeyword = KEY_STR_NULL; break; - case KEY_TRUE: aKeyword = KEY_STR_TRUE; break; - case KEY_FALSE: aKeyword = KEY_STR_FALSE; break; - case KEY_IS: aKeyword = KEY_STR_IS; break; - case KEY_BETWEEN: aKeyword = KEY_STR_BETWEEN; break; - case KEY_OR: aKeyword = KEY_STR_OR; break; - case KEY_AND: aKeyword = KEY_STR_AND; break; - case KEY_AVG: aKeyword = KEY_STR_AVG; break; - case KEY_COUNT: aKeyword = KEY_STR_COUNT; break; - case KEY_MAX: aKeyword = KEY_STR_MAX; break; - case KEY_MIN: aKeyword = KEY_STR_MIN; break; - case KEY_SUM: aKeyword = KEY_STR_SUM; break; - case KEY_EVERY: aKeyword = KEY_STR_EVERY; break; - case KEY_ANY: aKeyword = KEY_STR_ANY; break; - case KEY_SOME: aKeyword = KEY_STR_SOME; break; - case KEY_STDDEV_POP: aKeyword = KEY_STR_STDDEV_POP; break; - case KEY_STDDEV_SAMP: aKeyword = KEY_STR_STDDEV_SAMP; break; - case KEY_VAR_SAMP: aKeyword = KEY_STR_VAR_SAMP; break; - case KEY_VAR_POP: aKeyword = KEY_STR_VAR_POP; break; - case KEY_COLLECT: aKeyword = KEY_STR_COLLECT; break; - case KEY_FUSION: aKeyword = KEY_STR_FUSION; break; - case KEY_INTERSECTION:aKeyword = KEY_STR_INTERSECTION; break; - case KEY_NONE: break; - default: - OSL_FAIL( "OParseContext::getIntlKeywordAscii: unknown key!" ); - break; - } - return aKeyword; -} - -//----------------------------------------------------------------------------- -IParseContext::InternationalKeyCode OParseContext::getIntlKeyCode(const ::rtl::OString& rToken) const -{ - static IParseContext::InternationalKeyCode Intl_TokenID[] = - { - KEY_LIKE, KEY_NOT, KEY_NULL, KEY_TRUE, - KEY_FALSE, KEY_IS, KEY_BETWEEN, KEY_OR, - KEY_AND, KEY_AVG, KEY_COUNT, KEY_MAX, - KEY_MIN, KEY_SUM, KEY_EVERY,KEY_ANY,KEY_SOME, - KEY_STDDEV_POP,KEY_STDDEV_SAMP,KEY_VAR_SAMP, - KEY_VAR_POP,KEY_COLLECT,KEY_FUSION,KEY_INTERSECTION - }; - - sal_uInt32 nCount = SAL_N_ELEMENTS( Intl_TokenID ); - for (sal_uInt32 i = 0; i < nCount; i++) - { - ::rtl::OString aKey = getIntlKeywordAscii(Intl_TokenID[i]); - if (rToken.equalsIgnoreAsciiCase(aKey)) - return Intl_TokenID[i]; - } - - return KEY_NONE; -} - -//------------------------------------------------------------------------------ -static Locale& impl_getLocaleInstance( ) -{ - static Locale s_aLocale( - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "en" ) ), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "US" ) ), - ::rtl::OUString( ) - ); - return s_aLocale; -} - -//------------------------------------------------------------------------------ -void OParseContext::setDefaultLocale( const ::com::sun::star::lang::Locale& _rLocale ) -{ - impl_getLocaleInstance() = _rLocale; -} - -//------------------------------------------------------------------------------ -Locale OParseContext::getPreferredLocale( ) const -{ - return getDefaultLocale(); -} - -//------------------------------------------------------------------------------ -const Locale& OParseContext::getDefaultLocale() -{ - return impl_getLocaleInstance(); -} - -//========================================================================== -//= misc -//========================================================================== -// Der (leider globale) yylval fuer die Uebergabe von -// Werten vom Scanner an den Parser. Die globale Variable -// wird nur kurzzeitig verwendet, der Parser liest die Variable -// sofort nach dem Scanner-Aufruf in eine gleichnamige eigene -// Member-Variable. - -const double fMilliSecondsPerDay = 86400000.0; - -//------------------------------------------------------------------------------ - - -//------------------------------------------------------------------ -::rtl::OUString ConvertLikeToken(const OSQLParseNode* pTokenNode, const OSQLParseNode* pEscapeNode, sal_Bool bInternational) -{ - ::rtl::OUStringBuffer aMatchStr; - if (pTokenNode->isToken()) - { - sal_Unicode cEscape = 0; - if (pEscapeNode->count()) - cEscape = pEscapeNode->getChild(1)->getTokenValue().toChar(); - - // Platzhalter austauschen - aMatchStr = pTokenNode->getTokenValue(); - const sal_Int32 nLen = aMatchStr.getLength(); - ::rtl::OUStringBuffer sSearch,sReplace; - if ( bInternational ) - { - sSearch.appendAscii("%_",2); - sReplace.appendAscii("*?",2); - } - else - { - sSearch.appendAscii("*?",2); - sReplace.appendAscii("%_",2); - } - - for (sal_Int32 i = 0; i < nLen; i++) - { - const sal_Unicode c = aMatchStr.charAt(i); - if (c == sSearch.charAt(0) || c == sSearch.charAt(1)) - { - if (i > 0 && aMatchStr.charAt(i-1) == cEscape) - continue; - else - { - const sal_Unicode cCharacter = sReplace.charAt( (c == sSearch.charAt(0)) ? 0 : 1); - aMatchStr.setCharAt(i , cCharacter); - } - } - } - } - return aMatchStr.makeStringAndClear(); -} - -//========================================================================== -//= OSQLParser -//========================================================================== - -sal_uInt32 OSQLParser::s_nRuleIDs[OSQLParseNode::rule_count + 1]; -OSQLParser::RuleIDMap OSQLParser::s_aReverseRuleIDLookup; -OParseContext OSQLParser::s_aDefaultContext; - -sal_Int32 OSQLParser::s_nRefCount = 0; -// ::osl::Mutex OSQLParser::s_aMutex; -OSQLScanner* OSQLParser::s_pScanner = 0; -OSQLParseNodesGarbageCollector* OSQLParser::s_pGarbageCollector = 0; -::com::sun::star::uno::Reference< ::com::sun::star::i18n::XLocaleData> OSQLParser::s_xLocaleData = NULL; -//----------------------------------------------------------------------------- -void setParser(OSQLParser* _pParser) -{ - xxx_pGLOBAL_SQLPARSER = _pParser; -} -// ------------------------------------------------------------------------- -void OSQLParser::setParseTree(OSQLParseNode * pNewParseTree) -{ - ::osl::MutexGuard aGuard(getMutex()); - m_pParseTree = pNewParseTree; -} -//----------------------------------------------------------------------------- -OSQLParseNode* OSQLParser::parseTree(::rtl::OUString& rErrorMessage, - const ::rtl::OUString& rStatement, - sal_Bool bInternational) -{ - - - // Guard the parsing - ::osl::MutexGuard aGuard(getMutex()); - // must be reset - setParser(this); - - // defines how to scan - s_pScanner->SetRule(s_pScanner->GetSQLRule()); // initial - s_pScanner->prepareScan(rStatement, m_pContext, bInternational); - - SQLyylval.pParseNode = NULL; - // SQLyypvt = NULL; - m_pParseTree = NULL; - m_sErrorMessage = ::rtl::OUString(); - - // ... und den Parser anwerfen ... - if (SQLyyparse() != 0) - { - // only set the error message, if it's not already set - if (!m_sErrorMessage.getLength()) - m_sErrorMessage = s_pScanner->getErrorMessage(); - if (!m_sErrorMessage.getLength()) - m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_GENERAL); - - rErrorMessage = m_sErrorMessage; - - // clear the garbage collector - (*s_pGarbageCollector)->clearAndDelete(); - return NULL; - } - else - { - (*s_pGarbageCollector)->clear(); - - // Das Ergebnis liefern (den Root Parse Node): - - // OSL_ENSURE(Sdbyyval.pParseNode != NULL,"OSQLParser: Parser hat keinen ParseNode geliefert"); - // return Sdbyyval.pParseNode; - // geht nicht wegen Bug in MKS YACC-erzeugtem Code (es wird ein falscher ParseNode - // geliefert). - - // Stattdessen setzt die Parse-Routine jetzt den Member pParseTree - // - einfach diesen zurueckliefern: - OSL_ENSURE(m_pParseTree != NULL,"OSQLParser: Parser hat keinen ParseTree geliefert"); - return m_pParseTree; - } -} -//----------------------------------------------------------------------------- -::rtl::OString OSQLParser::TokenIDToStr(sal_uInt32 nTokenID, const IParseContext* pContext) -{ - ::rtl::OString aStr; - if (pContext) - { - IParseContext::InternationalKeyCode eKeyCode = IParseContext::KEY_NONE; - switch( nTokenID ) - { - case SQL_TOKEN_LIKE: eKeyCode = IParseContext::KEY_LIKE; break; - case SQL_TOKEN_NOT: eKeyCode = IParseContext::KEY_NOT; break; - case SQL_TOKEN_NULL: eKeyCode = IParseContext::KEY_NULL; break; - case SQL_TOKEN_TRUE: eKeyCode = IParseContext::KEY_TRUE; break; - case SQL_TOKEN_FALSE: eKeyCode = IParseContext::KEY_FALSE; break; - case SQL_TOKEN_IS: eKeyCode = IParseContext::KEY_IS; break; - case SQL_TOKEN_BETWEEN: eKeyCode = IParseContext::KEY_BETWEEN; break; - case SQL_TOKEN_OR: eKeyCode = IParseContext::KEY_OR; break; - case SQL_TOKEN_AND: eKeyCode = IParseContext::KEY_AND; break; - case SQL_TOKEN_AVG: eKeyCode = IParseContext::KEY_AVG; break; - case SQL_TOKEN_COUNT: eKeyCode = IParseContext::KEY_COUNT; break; - case SQL_TOKEN_MAX: eKeyCode = IParseContext::KEY_MAX; break; - case SQL_TOKEN_MIN: eKeyCode = IParseContext::KEY_MIN; break; - case SQL_TOKEN_SUM: eKeyCode = IParseContext::KEY_SUM; break; - } - if ( eKeyCode != IParseContext::KEY_NONE ) - aStr = pContext->getIntlKeywordAscii(eKeyCode); - } - - if (!aStr.getLength()) - { - aStr = yytname[YYTRANSLATE(nTokenID)]; - if(!aStr.compareTo("SQL_TOKEN_",10)) - aStr = aStr.copy(10); - } - return aStr; -} - -//----------------------------------------------------------------------------- -::rtl::OUString OSQLParser::RuleIDToStr(sal_uInt32 nRuleID) -{ - OSL_ENSURE(nRuleID < SAL_N_ELEMENTS(yytname), "OSQLParser::RuleIDToStr: Invalid nRuleId!"); - return ::rtl::OUString::createFromAscii(yytname[nRuleID]); -} - -//----------------------------------------------------------------------------- -sal_uInt32 OSQLParser::StrToRuleID(const ::rtl::OString & rValue) -{ - // In yysvar nach dem angegebenen Namen suchen, den Index zurueckliefern - // (oder 0, wenn nicht gefunden) - static sal_uInt32 nLen = SAL_N_ELEMENTS(yytname); - for (sal_uInt32 i = YYTRANSLATE(SQL_TOKEN_INVALIDSYMBOL); i < (nLen-1); i++) - { - if (yytname && rValue == yytname[i]) - return i; - } - - // Nicht gefunden - return 0; -} - -//----------------------------------------------------------------------------- -OSQLParseNode::Rule OSQLParser::RuleIDToRule( sal_uInt32 _nRule ) -{ - return s_aReverseRuleIDLookup[ _nRule ]; -} - -//----------------------------------------------------------------------------- -sal_uInt32 OSQLParser::RuleID(OSQLParseNode::Rule eRule) -{ - return s_nRuleIDs[(sal_uInt16)eRule]; -} -// ------------------------------------------------------------------------- -sal_Int16 OSQLParser::buildNode(OSQLParseNode*& pAppend,OSQLParseNode* pCompare,OSQLParseNode* pLiteral,OSQLParseNode* pLiteral2) -{ - OSQLParseNode* pColumnRef = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); - pColumnRef->append(new OSQLInternalNode(m_sFieldName,SQL_NODE_NAME)); - OSQLParseNode* pComp = NULL; - if ( SQL_ISTOKEN( pCompare, BETWEEN) && pLiteral2 ) - pComp = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::between_predicate_part_2)); - else - pComp = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::comparison_predicate)); - - pComp->append(pColumnRef); - pComp->append(pCompare); - pComp->append(pLiteral); - if ( pLiteral2 ) - { - pComp->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD,SQL_TOKEN_AND)); - pComp->append(pLiteral2); - } - pAppend->append(pComp); - return 1; -} -//----------------------------------------------------------------------------- -sal_Int16 OSQLParser::buildStringNodes(OSQLParseNode*& pLiteral) -{ - if(!pLiteral) - return 1; - - if(SQL_ISRULE(pLiteral,set_fct_spec) || SQL_ISRULE(pLiteral,general_set_fct) || SQL_ISRULE(pLiteral,column_ref) - || SQL_ISRULE(pLiteral,subquery)) - return 1; // here I have a function that I can't transform into a string - - if(pLiteral->getNodeType() == SQL_NODE_INTNUM || pLiteral->getNodeType() == SQL_NODE_APPROXNUM || pLiteral->getNodeType() == SQL_NODE_ACCESS_DATE) - { - OSQLParseNode* pParent = pLiteral->getParent(); - - OSQLParseNode* pNewNode = new OSQLInternalNode(pLiteral->getTokenValue(), SQL_NODE_STRING); - pParent->replace(pLiteral, pNewNode); - delete pLiteral; - pLiteral = NULL; - return 1; - } - - for(sal_uInt32 i=0;i<pLiteral->count();++i) - { - OSQLParseNode* pChild = pLiteral->getChild(i); - buildStringNodes(pChild); - } - if(SQL_ISRULE(pLiteral,term) || SQL_ISRULE(pLiteral,value_exp_primary)) - { - m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_COMPARE); - return 0; - } - return 1; -} -//----------------------------------------------------------------------------- -sal_Int16 OSQLParser::buildComparsionRule(OSQLParseNode*& pAppend,OSQLParseNode* pLiteral) -{ - OSQLParseNode* pComp = new OSQLInternalNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("=")), SQL_NODE_EQUAL); - return buildPredicateRule(pAppend,pLiteral,pComp); -} - - -//----------------------------------------------------------------------------- -void OSQLParser::reduceLiteral(OSQLParseNode*& pLiteral, sal_Bool bAppendBlank) -{ - OSL_ENSURE(pLiteral->isRule(), "This is no ::com::sun::star::chaos::Rule"); - OSL_ENSURE(pLiteral->count() == 2, "OSQLParser::ReduceLiteral() Invalid count"); - OSQLParseNode* pTemp = pLiteral; - ::rtl::OUStringBuffer aValue(pLiteral->getChild(0)->getTokenValue()); - if (bAppendBlank) - { - aValue.appendAscii(" "); - } - - aValue.append(pLiteral->getChild(1)->getTokenValue()); - - pLiteral = new OSQLInternalNode(aValue.makeStringAndClear(),SQL_NODE_STRING); - delete pTemp; -} - -// ------------------------------------------------------------------------- -void OSQLParser::error(const sal_Char *fmt) -{ - if(!m_sErrorMessage.getLength()) - { - ::rtl::OUString sStr(fmt,strlen(fmt),RTL_TEXTENCODING_UTF8); - ::rtl::OUString sSQL_TOKEN(RTL_CONSTASCII_USTRINGPARAM("SQL_TOKEN_")); - - sal_Int32 nPos1 = sStr.indexOf(sSQL_TOKEN); - if(nPos1 != -1) - { - ::rtl::OUString sFirst = sStr.copy(0,nPos1); - sal_Int32 nPos2 = sStr.indexOf(sSQL_TOKEN,nPos1+1); - if(nPos2 != -1) - { - ::rtl::OUString sSecond = sStr.copy(nPos1+sSQL_TOKEN.getLength(),nPos2-nPos1-sSQL_TOKEN.getLength()); - sFirst += sSecond; - sFirst += sStr.copy(nPos2+sSQL_TOKEN.getLength()); - } - else - sFirst += sStr.copy(nPos1+sSQL_TOKEN.getLength()); - - m_sErrorMessage = sFirst; - } - else - m_sErrorMessage = sStr; - - ::rtl::OUString aError = s_pScanner->getErrorMessage(); - if(aError.getLength()) - { - m_sErrorMessage += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(", ")); - m_sErrorMessage += aError; - } - } -} -// ------------------------------------------------------------------------- -int OSQLParser::SQLlex() -{ - return s_pScanner->SQLlex(); -} - -#if defined __SUNPRO_CC -#pragma enable_warn -#elif defined _MSC_VER -#pragma warning(pop) -#endif |