📄 parse.y
字号:
%{/* * PROGRAM: Dynamic SQL runtime support * MODULE: parse.y * DESCRIPTION: Dynamic SQL parser * * The contents of this file are subject to the Interbase Public * License Version 1.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy * of the License at http://www.Inprise.com/IPL.html * * Software distributed under the License is distributed on an * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express * or implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code was created by Inprise Corporation * and its predecessors. Portions created by Inprise Corporation are * Copyright (C) Inprise Corporation. * * All Rights Reserved. * Contributor(s): ______________________________________. * 2001.05.20 Neil McCalden: Allow a udf to be used in a 'group by' clause. * 2001.05.30 Claudio Valderrama: DROP TABLE and DROP VIEW lead now to two * different node types so DDL can tell which is which. * 2001.06.13 Claudio Valderrama: SUBSTRING is being surfaced. * 2001.06.30 Claudio valderrama: Feed (line,column) for each node. See node.h. * 2001.07.10 Claudio Valderrama: Better (line,column) report and "--" for comments. * 2001.07.28 John Bellardo: Changes to support parsing LIMIT and FIRST * 2001.08.03 John Bellardo: Finalized syntax for LIMIT, change LIMIT to SKIP * 2001.08.05 Claudio Valderrama: closed Bug #448062 and other spaces that appear * in rdb$*_source fields when altering domains plus one unexpected null pointer. * 2001.08.12 Claudio Valderrama: adjust SUBSTRING's starting pos argument here * and not in gen.c; this closes Bug #450301. * 2001.10.01 Claudio Valderrama: enable explicit GRANT...to ROLE role_name. * 2001.10.06 Claudio Valderrama: Honor explicit USER keyword in GRANTs and REVOKEs. */#if defined(DEV_BUILD) && defined(WIN32) && defined(SUPERSERVER)#include <windows.h>/*#include <wincon.h>*/#endif#include <stdio.h>#include <stdlib.h>#include <string.h>#include "../jrd/common.h"#include <stdarg.h>#include "../jrd/iberror.h"#include "../dsql/dsql.h"#include "../dsql/node.h"#include "../dsql/sym.h"#include "../jrd/gds.h"#include "../jrd/flags.h"#include "../dsql/alld_proto.h"#include "../dsql/errd_proto.h"#include "../dsql/hsh_proto.h"#include "../dsql/make_proto.h"#include "../dsql/parse_proto.h"#include "../jrd/gds_proto.h"#include "../jrd/thd_proto.h"#ifndef WINDOWS_ONLY#include "../wal/wal.h"#endif/* Can't include ../jrd/err_proto.h here because it pulls jrd.h. */#if !defined(_JRD_ERR_PROTO_H_)extern TEXT * DLL_EXPORT ERR_string (TEXT *, int);#endifASSERT_FILENAME/* Remove compiler warning produced by redef of WRITE & READ from WINDOWS.H */#ifdef WINDOWS_ONLY#undef READ#undef WRITE#endif/* since UNIX isn't standard, we have to define stuff which is in <limits.h> (which isn't available on all UNIXes... */#define SHRT_POS_MAX 32767#define SHRT_UNSIGNED_MAX 65535#define SHRT_NEG_MAX 32768#define LONG_POS_MAX 2147483647#define POSITIVE 0#define NEGATIVE 1#define UNSIGNED 2#define MIN_CACHE_BUFFERS 250#define DEF_CACHE_BUFFERS 1000#define YYSTYPE NOD#if defined(DEBUG) || defined(DEV_BUILD)#define YYDEBUG 1#endifstatic CONST UCHAR INTERNAL_FIELD_NAME [] = "DSQL internal"; /* NTX: placeholder */static CONST UCHAR NULL_STRING [] = ""; #ifndef SHLIB_DEFSNOD DSQL_parse;#elseextern NOD DSQL_parse;#endifstatic FLD field;static FIL file;static NOD field_name;static TEXT *beginning;static SSHORT log_defined, cache_defined;static void yyerror (TEXT *);%}/* token declarations *//* Tokens are organized chronologically by date added. See dsql/keywords.h for a list organized alphabetically *//* Tokens in v4.0 -- not separated into v3 and v4 tokens */%token ACTIVE%token ADD%token AFTER%token ALL%token ALTER%token AND%token ANY%token AS%token ASC%token AT%token AVG%token AUTO%token BASENAME%token BEFORE%token BEGIN%token BETWEEN%token BLOB%token BY%token CACHE%token CAST%token CHARACTER%token CHECK%token CHECK_POINT_LEN%token COLLATE%token COLLATION%token COMMA%token COMMIT%token COMMITTED%token COMPUTED%token CONCATENATE%token CONDITIONAL%token CONSTRAINT%token CONTAINING%token COUNT%token CREATE%token CSTRING%token CURRENT%token CURSOR%token DATABASE%token DATE%token DB_KEY%token DEBUG%token DECIMAL%token DECLARE%token DEFAULT%token DELETE%token DESC%token DISTINCT%token DO%token DOMAIN%token DROP%token ELSE%token END%token ENTRY_POINT%token EQL%token ESCAPE%token EXCEPTION%token EXECUTE%token EXISTS%token EXIT%token EXTERNAL%token FILTER%token FOR%token FOREIGN%token FROM%token FULL%token FUNCTION%token GDSCODE%token GEQ%token GENERATOR%token GEN_ID%token GRANT%token GROUP%token GROUP_COMMIT_WAIT%token GTR%token HAVING%token IF%token IN%token INACTIVE%token INNER%token INPUT_TYPE%token INDEX%token INSERT%token INTEGER%token INTO%token IS%token ISOLATION%token JOIN%token KEY%token KW_CHAR%token KW_DEC%token KW_DOUBLE%token KW_FILE%token KW_FLOAT%token KW_INT%token KW_LONG%token KW_NULL%token KW_NUMERIC%token KW_UPPER%token KW_VALUE%token LENGTH%token LOGFILE%token LPAREN%token LEFT%token LEQ%token LEVEL%token LIKE%token LOG_BUF_SIZE%token LSS%token MANUAL%token MAXIMUM%token MAX_SEGMENT%token MERGE%token MESSAGE%token MINIMUM%token MODULE_NAME%token NAMES%token NATIONAL%token NATURAL%token NCHAR%token NEQ%token NO%token NOT%token NOT_GTR%token NOT_LSS%token NUM_LOG_BUFS%token OF%token ON%token ONLY%token OPTION%token OR%token ORDER%token OUTER%token OUTPUT_TYPE%token OVERFLOW%token PAGE%token PAGES%token PAGE_SIZE%token PARAMETER%token PASSWORD%token PLAN%token POSITION%token POST_EVENT%token PRECISION%token PRIMARY%token PRIVILEGES%token PROCEDURE%token PROTECTED%token RAW_PARTITIONS%token READ%token REAL%token RECREATE%token REFERENCES%token RESERVING%token RETAIN%token RETURNING_VALUES%token RETURNS%token REVOKE%token RIGHT%token RPAREN%token ROLLBACK%token SEGMENT%token SELECT%token SET%token SHADOW%token SHARED%token SINGULAR%token SIZE%token SMALLINT%token SNAPSHOT%token SOME%token SORT%token SQLCODE%token STABILITY%token STARTING%token STATISTICS%token SUB_TYPE%token SUSPEND%token SUM%token TABLE%token THEN%token TO%token TRANSACTION%token TRIGGER%token UNCOMMITTED%token UNION%token UNIQUE%token UPDATE%token USER%token VALUES%token VARCHAR%token VARIABLE%token VARYING%token VERSION%token VIEW%token WAIT%token WHEN%token WHERE%token WHILE%token WITH%token WORK%token WRITE%token FLOAT NUMBER NUMERIC SYMBOL STRING INTRODUCER /* New tokens added v5.0 */%token ACTION%token ADMIN%token CASCADE%token FREE_IT /* ISC SQL extension */%token RESTRICT%token ROLE/* New tokens added v6.0 */%token COLUMN%token TYPE%token EXTRACT%token YEAR%token MONTH%token DAY%token HOUR%token MINUTE%token SECOND%token WEEKDAY /* ISC SQL extension */%token YEARDAY /* ISC SQL extension */%token TIME%token TIMESTAMP%token CURRENT_DATE%token CURRENT_TIME%token CURRENT_TIMESTAMP/* CVC: Special Firebird additions. */%token CURRENT_USER%token CURRENT_ROLE%token KW_BREAK%token SUBSTRING%token KW_DESCRIPTOR%token FIRST%token SKIP/* special aggregate token types returned by lex in v6.0 */%token NUMBER64BIT SCALEDINT/* precedence declarations for expression evaluation */%left OR%left AND%left NOT%left '=' '<' '>' LIKE EQL NEQ GTR LSS GEQ LEQ NOT_GTR NOT_LSS%left '+' '-'%left '*' '/'%left CONCATENATE%left COLLATE/* Fix the dangling IF-THEN-ELSE problem */%nonassoc THEN%nonassoc ELSE/* The same issue exists with ALTER COLUMN now that keywords can be used in order to change their names. The syntax which shows the issue is: ALTER COLUMN where column is part of the alter statement or ALTER COLUMN where column is the name of the column in the relation*/%nonassoc ALTER%nonassoc COLUMN%%/* list of possible statements */top : statement { DSQL_parse = $1; } | statement ';' { DSQL_parse = $1; } ;statement : alter | blob | commit | create | declare | delete | drop | grant | insert | invoke_procedure | recreate | revoke | rollback | select | set | update | DEBUG signed_short_integer { prepare_console_debug ((int) $2, &yydebug); $$ = make_node (nod_null, (int) 0, NULL); } ;/* GRANT statement */grant : GRANT privileges ON prot_table_name TO user_grantee_list grant_option { $$ = make_node (nod_grant, (int) e_grant_count, $2, $4, make_list($6), $7); } | GRANT proc_privileges ON PROCEDURE simple_proc_name TO user_grantee_list grant_option { $$ = make_node (nod_grant, (int) e_grant_count, $2, $5, make_list($7), $8); } | GRANT privileges ON prot_table_name TO grantee_list { $$ = make_node (nod_grant, (int) e_grant_count, $2, $4, make_list($6), NULL); } | GRANT proc_privileges ON PROCEDURE simple_proc_name TO grantee_list { $$ = make_node (nod_grant, (int) e_grant_count, $2, $5, make_list($7), NULL); } | GRANT role_name_list TO role_grantee_list role_admin_option { $$ = make_node (nod_grant, (int) e_grant_count, make_list($2), make_list($4), NULL, $5); } ; prot_table_name : simple_table_name | TABLE simple_table_name { $$ = $2; } ;privileges : ALL { $$ = make_node (nod_all, (int) 0, NULL); } | ALL PRIVILEGES { $$ = make_node (nod_all, (int) 0, NULL); } | privilege_list { $$ = make_list ($1); } ;privilege_list : privilege | privilege_list ',' privilege { $$ = make_node (nod_list, (int) 2, $1, $3); } ;proc_privileges : EXECUTE { $$ = make_list (make_node (nod_execute, (int) 0, NULL)); } ;privilege : SELECT { $$ = make_node (nod_select, (int) 0, NULL); } | INSERT { $$ = make_node (nod_insert, (int) 0, NULL); } | DELETE { $$ = make_node (nod_delete, (int) 0, NULL); } | UPDATE column_parens_opt { $$ = make_node (nod_update, (int) 1, $2); } | REFERENCES column_parens_opt { $$ = make_node (nod_references, (int) 1, $2); } ;grant_option : WITH GRANT OPTION { $$ = make_node (nod_grant, (int) 0, NULL); } | { $$ = 0; } ;role_admin_option : WITH ADMIN OPTION { $$ = make_node (nod_grant_admin, (int) 0, NULL); } | { $$ = 0; } ;simple_proc_name: symbol_procedure_name { $$ = make_node (nod_procedure_name, (int) 1, $1); } ;/* REVOKE statement */revoke : REVOKE rev_grant_option privileges ON prot_table_name FROM user_grantee_list { $$ = make_node (nod_revoke, (int) e_grant_count, $3, $5, make_list($7), $2); } | REVOKE rev_grant_option proc_privileges ON PROCEDURE simple_proc_name FROM user_grantee_list { $$ = make_node (nod_revoke, (int) e_grant_count, $3, $6, make_list($8), $2); } | REVOKE privileges ON prot_table_name FROM user_grantee_list { $$ = make_node (nod_revoke, (int) e_grant_count, $2, $4, make_list($6), NULL); } | REVOKE proc_privileges ON
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -