mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-24 04:03:03 +01:00
Replace parser hacks by correct btyacc's token position handling.
This fixes some problems introduced in 3.0 related to backtrackings. It also fixes some non-precise line/column information in some commands (FOR ... DO <command>) and stored SQL text prefixed with spaces (in views, for example).
This commit is contained in:
parent
d1f9eb91b5
commit
029d0e89a8
@ -47,8 +47,19 @@ class dsql_nod;
|
|||||||
class Parser : public Firebird::PermanentStorage
|
class Parser : public Firebird::PermanentStorage
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
// User-defined text position type.
|
||||||
|
struct Position
|
||||||
|
{
|
||||||
|
USHORT firstLine;
|
||||||
|
USHORT firstColumn;
|
||||||
|
USHORT lastLine;
|
||||||
|
USHORT lastColumn;
|
||||||
|
const char* firstPos;
|
||||||
|
const char* lastPos;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef Position YYPOSN;
|
||||||
typedef int Yshort;
|
typedef int Yshort;
|
||||||
typedef int YYPOSN; // user-defined text position type
|
|
||||||
|
|
||||||
struct yyparsestate
|
struct yyparsestate
|
||||||
{
|
{
|
||||||
@ -78,11 +89,6 @@ private:
|
|||||||
|
|
||||||
// Actual lexer state begins from here
|
// Actual lexer state begins from here
|
||||||
|
|
||||||
// hvlad: if at some day 16 levels of nesting would be not enough
|
|
||||||
// then someone must add LexerState constructor and pass memory
|
|
||||||
// pool into Stack's constructor or change Capacity value in template
|
|
||||||
// instantiation below
|
|
||||||
Firebird::Stack<const TEXT*> beginnings;
|
|
||||||
const TEXT* ptr;
|
const TEXT* ptr;
|
||||||
const TEXT* end;
|
const TEXT* end;
|
||||||
const TEXT* last_token;
|
const TEXT* last_token;
|
||||||
@ -252,13 +258,16 @@ private:
|
|||||||
|
|
||||||
// start - defined in parse.y
|
// start - defined in parse.y
|
||||||
private:
|
private:
|
||||||
|
void yyReducePosn(YYPOSN& ret, YYPOSN* termPosns, YYSTYPE* termVals,
|
||||||
|
int termNo, int stkPos, int yychar, YYPOSN& yyposn, void*);
|
||||||
|
|
||||||
int yylex();
|
int yylex();
|
||||||
int yylexAux();
|
int yylexAux();
|
||||||
|
|
||||||
void yyerror(const TEXT* error_string);
|
void yyerror(const TEXT* error_string);
|
||||||
void yyerror_detailed(const TEXT* error_string, int yychar, YYSTYPE&, YYPOSN&);
|
void yyerror_detailed(const TEXT* error_string, int yychar, YYSTYPE&, YYPOSN&);
|
||||||
|
|
||||||
const TEXT* lex_position();
|
dsql_str* makeParseStr(const Position& p1, const Position& p2);
|
||||||
dsql_nod* make_list (dsql_nod* node);
|
dsql_nod* make_list (dsql_nod* node);
|
||||||
ParameterNode* make_parameter();
|
ParameterNode* make_parameter();
|
||||||
dsql_nod* make_node(Dsql::nod_t type, int count, ...);
|
dsql_nod* make_node(Dsql::nod_t type, int count, ...);
|
||||||
@ -285,7 +294,7 @@ private:
|
|||||||
|
|
||||||
// These value/posn of the root non-terminal are returned to the caller
|
// These value/posn of the root non-terminal are returned to the caller
|
||||||
YYSTYPE yyretlval;
|
YYSTYPE yyretlval;
|
||||||
int yyretposn;
|
Position yyretposn;
|
||||||
|
|
||||||
int yynerrs;
|
int yynerrs;
|
||||||
|
|
||||||
@ -302,13 +311,13 @@ private:
|
|||||||
// The last allocated position at the lexical value queue
|
// The last allocated position at the lexical value queue
|
||||||
YYSTYPE* yylvlim;
|
YYSTYPE* yylvlim;
|
||||||
// Base of the lexical position queue
|
// Base of the lexical position queue
|
||||||
int* yylpsns;
|
Position* yylpsns;
|
||||||
// Current posistion at lexical position queue
|
// Current posistion at lexical position queue
|
||||||
int* yylpp;
|
Position* yylpp;
|
||||||
// End position of lexical position queue
|
// End position of lexical position queue
|
||||||
int* yylpe;
|
Position* yylpe;
|
||||||
// The last allocated position at the lexical position queue
|
// The last allocated position at the lexical position queue
|
||||||
int* yylplim;
|
Position* yylplim;
|
||||||
// Current position at lexical token queue
|
// Current position at lexical token queue
|
||||||
Yshort* yylexp;
|
Yshort* yylexp;
|
||||||
Yshort* yylexemes;
|
Yshort* yylexemes;
|
||||||
|
371
src/dsql/parse.y
371
src/dsql/parse.y
@ -116,6 +116,9 @@ const int UNSIGNED = 2;
|
|||||||
#define YYDEBUG 1
|
#define YYDEBUG 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define YYREDUCEPOSNFUNC yyReducePosn
|
||||||
|
#define YYREDUCEPOSNFUNCARG NULL
|
||||||
|
|
||||||
static const char INTERNAL_FIELD_NAME[] = "DSQL internal"; // NTX: placeholder
|
static const char INTERNAL_FIELD_NAME[] = "DSQL internal"; // NTX: placeholder
|
||||||
|
|
||||||
inline unsigned trigger_type_suffix(const unsigned slot1, const unsigned slot2, const unsigned slot3)
|
inline unsigned trigger_type_suffix(const unsigned slot1, const unsigned slot2, const unsigned slot3)
|
||||||
@ -671,7 +674,6 @@ inline void check_copy_incr(char*& to, const char ch, const char* const string)
|
|||||||
%type <compoundStmtNode> assignments
|
%type <compoundStmtNode> assignments
|
||||||
%type <legacyStr> admin_opt
|
%type <legacyStr> admin_opt
|
||||||
|
|
||||||
%type <legacyNode> begin_string begin_trigger
|
|
||||||
%type <legacyNode> blob_filter_subtype blob_io blob_segsize blob_subtype blob_subtype_io
|
%type <legacyNode> blob_filter_subtype blob_io blob_segsize blob_subtype blob_subtype_io
|
||||||
%type <legacyNode> blob_subtype_value_io blob_type
|
%type <legacyNode> blob_subtype_value_io blob_type
|
||||||
%type <stmtNode> breakleave
|
%type <stmtNode> breakleave
|
||||||
@ -709,13 +711,13 @@ inline void check_copy_incr(char*& to, const char ch, const char* const string)
|
|||||||
%type <legacyNode> drop_clause drop_user_clause
|
%type <legacyNode> drop_clause drop_user_clause
|
||||||
%type <legacyStr> db_name ddl_desc
|
%type <legacyStr> db_name ddl_desc
|
||||||
|
|
||||||
%type <legacyNode> end_default event_argument_opt exception_clause
|
%type <legacyNode> event_argument_opt exception_clause
|
||||||
%type err(<exceptionArray>) errors(<exceptionArray>)
|
%type err(<exceptionArray>) errors(<exceptionArray>)
|
||||||
%type <stmtNode> excp_hndl_statement exec_procedure exec_function
|
%type <stmtNode> excp_hndl_statement exec_procedure exec_function
|
||||||
%type <compoundStmtNode> excp_hndl_statements
|
%type <compoundStmtNode> excp_hndl_statements
|
||||||
%type <legacyNode> extra_indices_opt
|
%type <legacyNode> extra_indices_opt
|
||||||
%type <legacyNode> execute_privilege
|
%type <legacyNode> execute_privilege
|
||||||
%type <legacyStr> end_trigger entry_op
|
%type <legacyStr> entry_op
|
||||||
%type <pathNamePtr> external_file
|
%type <pathNamePtr> external_file
|
||||||
%type <execStatementNode> exec_into exec_sql
|
%type <execStatementNode> exec_into exec_sql
|
||||||
%type exec_stmt_option(<execStatementNode>) exec_stmt_options(<execStatementNode>)
|
%type exec_stmt_option(<execStatementNode>) exec_stmt_options(<execStatementNode>)
|
||||||
@ -815,8 +817,8 @@ inline void check_copy_incr(char*& to, const char ch, const char* const string)
|
|||||||
%type <legacyNode> simple_column_name simple_package_name simple_proc_name simple_table_name
|
%type <legacyNode> simple_column_name simple_package_name simple_proc_name simple_table_name
|
||||||
%type <stmtNode> simple_proc_statement singleton_select
|
%type <stmtNode> simple_proc_statement singleton_select
|
||||||
%type <legacyNode> simple_type simple_when_clause skip_clause
|
%type <legacyNode> simple_type simple_when_clause skip_clause
|
||||||
%type <legacyNode> snap_shot statement stmt_start_column
|
%type <legacyNode> snap_shot statement
|
||||||
%type <legacyNode> stmt_start_line string_length_opt
|
%type <legacyNode> string_length_opt
|
||||||
%type <legacyNode> symbol_UDF_call_name symbol_UDF_name symbol_blob_subtype_name symbol_character_set_name
|
%type <legacyNode> symbol_UDF_call_name symbol_UDF_name symbol_blob_subtype_name symbol_character_set_name
|
||||||
%type <legacyNode> symbol_collation_name symbol_column_name symbol_constraint_name symbol_cursor_name
|
%type <legacyNode> symbol_collation_name symbol_column_name symbol_constraint_name symbol_cursor_name
|
||||||
%type <legacyNode> symbol_ddl_name symbol_domain_name symbol_exception_name symbol_filter_name
|
%type <legacyNode> symbol_ddl_name symbol_domain_name symbol_exception_name symbol_filter_name
|
||||||
@ -1385,8 +1387,8 @@ index_definition
|
|||||||
: column_list
|
: column_list
|
||||||
{ $$ = make_list ($1); }
|
{ $$ = make_list ($1); }
|
||||||
| column_parens
|
| column_parens
|
||||||
| computed_by '(' begin_trigger value end_trigger ')'
|
| computed_by '(' value ')'
|
||||||
{ $$ = make_node (nod_def_computed, 2, $4, $5); }
|
{ $$ = make_node(nod_def_computed, 2, $3, makeParseStr(YYPOSNARG(2), YYPOSNARG(4))); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
@ -1464,8 +1466,11 @@ as_opt
|
|||||||
;
|
;
|
||||||
|
|
||||||
domain_default
|
domain_default
|
||||||
: DEFAULT begin_trigger default_value end_default
|
: DEFAULT default_value
|
||||||
{ $$ = make_node (nod_def_default, (int) e_dft_count, $3, $4); }
|
{
|
||||||
|
$$ = make_node(nod_def_default, (int) e_dft_count,
|
||||||
|
$2, makeParseStr(YYPOSNARG(1), YYPOSNARG(2)));
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
domain_default_opt
|
domain_default_opt
|
||||||
@ -1478,8 +1483,11 @@ null_constraint
|
|||||||
;
|
;
|
||||||
|
|
||||||
check_constraint
|
check_constraint
|
||||||
: CHECK begin_trigger '(' search_condition ')' end_trigger
|
: CHECK '(' search_condition ')'
|
||||||
{ $$ = make_node (nod_def_constraint, (int) e_cnstr_count, NULL, NULL, $4, NULL, $6); }
|
{
|
||||||
|
$$ = make_node(nod_def_constraint, (int) e_cnstr_count,
|
||||||
|
NULL, NULL, $3, NULL, makeParseStr(YYPOSNARG(1), YYPOSNARG(4)));
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
@ -1757,12 +1765,13 @@ identity_clause
|
|||||||
|
|
||||||
// value does allow parens around it, but there is a problem getting the source text.
|
// value does allow parens around it, but there is a problem getting the source text.
|
||||||
|
|
||||||
def_computed : computed_clause '(' begin_trigger value end_trigger ')'
|
def_computed
|
||||||
{
|
: computed_clause '(' value ')'
|
||||||
lex.g_field->fld_flags |= FLD_computed;
|
{
|
||||||
$$ = make_node (nod_def_computed, 2, $4, $5);
|
lex.g_field->fld_flags |= FLD_computed;
|
||||||
}
|
$$ = make_node(nod_def_computed, 2, $3, makeParseStr(YYPOSNARG(2), YYPOSNARG(4)));
|
||||||
;
|
}
|
||||||
|
;
|
||||||
|
|
||||||
computed_clause
|
computed_clause
|
||||||
: computed_by
|
: computed_by
|
||||||
@ -1958,12 +1967,12 @@ referential_action: CASCADE
|
|||||||
|
|
||||||
|
|
||||||
procedure_clause
|
procedure_clause
|
||||||
: procedure_clause_start AS begin_string local_declaration_list full_proc_block end_trigger
|
: procedure_clause_start AS local_declaration_list full_proc_block
|
||||||
{
|
{
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
$$->source = toString($6);
|
$$->source = toString(makeParseStr(YYPOSNARG(3), YYPOSNARG(4)));
|
||||||
$$->localDeclList = $4;
|
$$->localDeclList = $3;
|
||||||
$$->body = $5;
|
$$->body = $4;
|
||||||
}
|
}
|
||||||
| procedure_clause_start external_clause external_body_clause_opt
|
| procedure_clause_start external_clause external_body_clause_opt
|
||||||
{
|
{
|
||||||
@ -2029,24 +2038,31 @@ output_proc_parameter($parameters)
|
|||||||
{ $parameters->add(ParameterClause(getPool(), $1, toName($3), NULL, NULL)); }
|
{ $parameters->add(ParameterClause(getPool(), $1, toName($3), NULL, NULL)); }
|
||||||
;
|
;
|
||||||
|
|
||||||
default_par_opt : DEFAULT begin_trigger default_value end_default
|
default_par_opt
|
||||||
{ $$ = make_node (nod_def_default, (int) e_dft_count, $3, $4); }
|
: /* nothing */
|
||||||
| '=' begin_trigger default_value end_default
|
{ $$ = NULL; }
|
||||||
{ $$ = make_node (nod_def_default, (int) e_dft_count, $3, $4); }
|
| DEFAULT default_value
|
||||||
|
|
{
|
||||||
{ $$ = NULL; }
|
$$ = make_node(nod_def_default, (int) e_dft_count,
|
||||||
;
|
$2, makeParseStr(YYPOSNARG(1), YYPOSNARG(2)));
|
||||||
|
}
|
||||||
|
| '=' default_value
|
||||||
|
{
|
||||||
|
$$ = make_node(nod_def_default, (int) e_dft_count,
|
||||||
|
$2, makeParseStr(YYPOSNARG(1), YYPOSNARG(2)));
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
// FUNCTION
|
// FUNCTION
|
||||||
|
|
||||||
function_clause
|
function_clause
|
||||||
: function_clause_start AS begin_string local_declaration_list full_proc_block end_trigger
|
: function_clause_start AS local_declaration_list full_proc_block
|
||||||
{
|
{
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
$$->source = toString($6);
|
$$->source = toString(makeParseStr(YYPOSNARG(3), YYPOSNARG(4)));
|
||||||
$$->localDeclList = $4;
|
$$->localDeclList = $3;
|
||||||
$$->body = $5;
|
$$->body = $4;
|
||||||
}
|
}
|
||||||
| function_clause_start external_clause external_body_clause_opt
|
| function_clause_start external_clause external_body_clause_opt
|
||||||
{
|
{
|
||||||
@ -2121,13 +2137,11 @@ replace_function_clause
|
|||||||
// PACKAGE
|
// PACKAGE
|
||||||
|
|
||||||
package_clause
|
package_clause
|
||||||
: symbol_package_name AS begin_string stmt_start_line stmt_start_column
|
: symbol_package_name AS BEGIN package_items_opt END
|
||||||
BEGIN package_items_opt END end_trigger
|
|
||||||
{
|
{
|
||||||
CreateAlterPackageNode* node = newNode<CreateAlterPackageNode>(toName($1));
|
CreateAlterPackageNode* node = newNode<CreateAlterPackageNode>(toName($1));
|
||||||
node->source = toString($9);
|
node->source = toString(makeParseStr(YYPOSNARG(3), YYPOSNARG(5)));
|
||||||
node->items = $7;
|
node->items = $4;
|
||||||
|
|
||||||
$$ = node;
|
$$ = node;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -2183,23 +2197,19 @@ replace_package_clause
|
|||||||
// PACKAGE BODY
|
// PACKAGE BODY
|
||||||
|
|
||||||
package_body_clause
|
package_body_clause
|
||||||
: symbol_package_name AS begin_string stmt_start_line stmt_start_column
|
: symbol_package_name AS BEGIN package_items package_body_items_opt END
|
||||||
BEGIN package_items package_body_items_opt END end_trigger
|
|
||||||
{
|
{
|
||||||
CreatePackageBodyNode* node = newNode<CreatePackageBodyNode>(toName($1));
|
CreatePackageBodyNode* node = newNode<CreatePackageBodyNode>(toName($1));
|
||||||
node->source = toString($10);
|
node->source = toString(makeParseStr(YYPOSNARG(3), YYPOSNARG(6)));
|
||||||
node->declaredItems = $7;
|
node->declaredItems = $4;
|
||||||
node->items = $8;
|
node->items = $5;
|
||||||
|
|
||||||
$$ = node;
|
$$ = node;
|
||||||
}
|
}
|
||||||
| symbol_package_name AS begin_string stmt_start_line stmt_start_column
|
| symbol_package_name AS BEGIN package_body_items_opt END
|
||||||
BEGIN package_body_items_opt END end_trigger
|
|
||||||
{
|
{
|
||||||
CreatePackageBodyNode* node = newNode<CreatePackageBodyNode>(toName($1));
|
CreatePackageBodyNode* node = newNode<CreatePackageBodyNode>(toName($1));
|
||||||
node->source = toString($9);
|
node->source = toString(makeParseStr(YYPOSNARG(3), YYPOSNARG(5)));
|
||||||
node->items = $7;
|
node->items = $4;
|
||||||
|
|
||||||
$$ = node;
|
$$ = node;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -2254,11 +2264,11 @@ local_declarations
|
|||||||
;
|
;
|
||||||
|
|
||||||
local_declaration
|
local_declaration
|
||||||
: stmt_start_line stmt_start_column DECLARE var_decl_opt local_declaration_item ';'
|
: DECLARE var_decl_opt local_declaration_item ';'
|
||||||
{
|
{
|
||||||
$$ = $5;
|
$$ = $3;
|
||||||
$$->line = (USHORT)(IPTR) $1;
|
$$->line = YYPOSNARG(1).firstLine;
|
||||||
$$->column = (USHORT)(IPTR) $2;
|
$$->column = YYPOSNARG(1).firstColumn;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -2304,8 +2314,8 @@ proc_block
|
|||||||
;
|
;
|
||||||
|
|
||||||
full_proc_block
|
full_proc_block
|
||||||
: stmt_start_line stmt_start_column BEGIN full_proc_block_body END
|
: BEGIN full_proc_block_body END
|
||||||
{ $$ = newNode<LineColumnNode>((USHORT)(IPTR) $1, (USHORT)(IPTR) $2, $4); }
|
{ $$ = newNode<LineColumnNode>(YYPOSNARG(1).firstLine, YYPOSNARG(1).firstColumn, $2); }
|
||||||
;
|
;
|
||||||
|
|
||||||
full_proc_block_body
|
full_proc_block_body
|
||||||
@ -2340,22 +2350,10 @@ proc_statements
|
|||||||
;
|
;
|
||||||
|
|
||||||
proc_statement
|
proc_statement
|
||||||
: stmt_start_line stmt_start_column simple_proc_statement ';'
|
: simple_proc_statement ';'
|
||||||
{ $$ = newNode<LineColumnNode>((USHORT)(IPTR) $1, (USHORT)(IPTR) $2, $3); }
|
{ $$ = newNode<LineColumnNode>(YYPOSNARG(1).firstLine, YYPOSNARG(1).firstColumn, $1); }
|
||||||
| stmt_start_line stmt_start_column complex_proc_statement
|
| complex_proc_statement
|
||||||
{ $$ = newNode<LineColumnNode>((USHORT)(IPTR) $1, (USHORT)(IPTR) $2, $3); }
|
{ $$ = newNode<LineColumnNode>(YYPOSNARG(1).firstLine, YYPOSNARG(1).firstColumn, $1); }
|
||||||
;
|
|
||||||
|
|
||||||
stmt_start_line
|
|
||||||
: /* nothing */ { $$ = (dsql_nod*) (IPTR) lex.lines_bk; }
|
|
||||||
;
|
|
||||||
|
|
||||||
stmt_start_column
|
|
||||||
: // nothing
|
|
||||||
{
|
|
||||||
const USHORT column = (lex.last_token_bk - lex.line_start_bk + 1);
|
|
||||||
$$ = (dsql_nod*) (IPTR) column;
|
|
||||||
}
|
|
||||||
;
|
;
|
||||||
|
|
||||||
simple_proc_statement
|
simple_proc_statement
|
||||||
@ -2826,11 +2824,11 @@ block_parameter($parameters)
|
|||||||
// CREATE VIEW
|
// CREATE VIEW
|
||||||
|
|
||||||
view_clause
|
view_clause
|
||||||
: simple_table_name column_parens_opt AS begin_string select_expr check_opt end_trigger
|
: simple_table_name column_parens_opt AS select_expr check_opt
|
||||||
{
|
{
|
||||||
CreateAlterViewNode* node = newNode<CreateAlterViewNode>($1, $2, $5);
|
CreateAlterViewNode* node = newNode<CreateAlterViewNode>($1, $2, $4);
|
||||||
node->source = toString($7);
|
node->source = toString(makeParseStr(YYPOSNARG(4), YYPOSNARG(5)));
|
||||||
node->withCheckOption = $6;
|
node->withCheckOption = $5;
|
||||||
$$ = node;
|
$$ = node;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -2858,46 +2856,6 @@ alter_view_clause
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
// these rules will capture the input string for storage in metadata
|
|
||||||
|
|
||||||
begin_string
|
|
||||||
: /* nothing */ { lex.beginnings.push(lex_position()); }
|
|
||||||
;
|
|
||||||
|
|
||||||
/*
|
|
||||||
end_string
|
|
||||||
:
|
|
||||||
{
|
|
||||||
const TEXT* start = lex.beginnings.pop();
|
|
||||||
$$ = (dsql_nod*) MAKE_string(start,
|
|
||||||
(lex_position() == lex.end) ? lex_position() - start : lex.last_token - start);
|
|
||||||
}
|
|
||||||
;
|
|
||||||
*/
|
|
||||||
|
|
||||||
begin_trigger
|
|
||||||
: /* nothing */ { lex.beginnings.push(lex.last_token); }
|
|
||||||
;
|
|
||||||
|
|
||||||
end_trigger
|
|
||||||
: // nothing
|
|
||||||
{
|
|
||||||
const TEXT* start = lex.beginnings.pop();
|
|
||||||
string str;
|
|
||||||
transformString(start, lex_position() - start, str);
|
|
||||||
$$ = MAKE_string(str.c_str(), str.length());
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
end_default
|
|
||||||
: // nothing
|
|
||||||
{
|
|
||||||
const TEXT* start = lex.beginnings.pop();
|
|
||||||
$$ = (dsql_nod*) MAKE_string(start,
|
|
||||||
(yychar <= 0 ? lex_position() : lex.last_token) - start);
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
check_opt
|
check_opt
|
||||||
: /* nothing */ { $$ = false; }
|
: /* nothing */ { $$ = false; }
|
||||||
| WITH CHECK OPTION { $$ = true; }
|
| WITH CHECK OPTION { $$ = true; }
|
||||||
@ -2907,28 +2865,19 @@ check_opt
|
|||||||
// CREATE TRIGGER
|
// CREATE TRIGGER
|
||||||
|
|
||||||
trigger_clause
|
trigger_clause
|
||||||
: symbol_trigger_name
|
: symbol_trigger_name trigger_active trigger_type trigger_position
|
||||||
trigger_active
|
AS local_declaration_list full_proc_block
|
||||||
trigger_type
|
|
||||||
trigger_position
|
|
||||||
AS begin_trigger
|
|
||||||
local_declaration_list
|
|
||||||
full_proc_block
|
|
||||||
end_trigger
|
|
||||||
{
|
{
|
||||||
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
||||||
$$->active = $2;
|
$$->active = $2;
|
||||||
$$->type = $3;
|
$$->type = $3;
|
||||||
$$->position = $4;
|
$$->position = $4;
|
||||||
$$->source = toString($9);
|
$$->source = toString(makeParseStr(YYPOSNARG(5), YYPOSNARG(7)));
|
||||||
$$->localDeclList = $7;
|
$$->localDeclList = $6;
|
||||||
$$->body = $8;
|
$$->body = $7;
|
||||||
}
|
}
|
||||||
| symbol_trigger_name
|
| symbol_trigger_name trigger_active trigger_type trigger_position
|
||||||
trigger_active
|
external_clause external_body_clause_opt
|
||||||
trigger_type
|
|
||||||
trigger_position
|
|
||||||
external_clause external_body_clause_opt
|
|
||||||
{
|
{
|
||||||
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
||||||
$$->active = $2;
|
$$->active = $2;
|
||||||
@ -2938,31 +2887,20 @@ trigger_clause
|
|||||||
if ($6)
|
if ($6)
|
||||||
$$->source = toString($6);
|
$$->source = toString($6);
|
||||||
}
|
}
|
||||||
| symbol_trigger_name
|
| symbol_trigger_name trigger_active trigger_type trigger_position ON symbol_table_name
|
||||||
trigger_active
|
AS local_declaration_list full_proc_block
|
||||||
trigger_type
|
|
||||||
trigger_position
|
|
||||||
ON symbol_table_name
|
|
||||||
AS begin_trigger
|
|
||||||
local_declaration_list
|
|
||||||
full_proc_block
|
|
||||||
end_trigger
|
|
||||||
{
|
{
|
||||||
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
||||||
$$->active = $2;
|
$$->active = $2;
|
||||||
$$->type = $3;
|
$$->type = $3;
|
||||||
$$->position = $4;
|
$$->position = $4;
|
||||||
$$->relationName = toName($6);
|
$$->relationName = toName($6);
|
||||||
$$->source = toString($11);
|
$$->source = toString(makeParseStr(YYPOSNARG(7), YYPOSNARG(9)));
|
||||||
$$->localDeclList = $9;
|
$$->localDeclList = $8;
|
||||||
$$->body = $10;
|
$$->body = $9;
|
||||||
}
|
}
|
||||||
| symbol_trigger_name
|
| symbol_trigger_name trigger_active trigger_type trigger_position ON symbol_table_name
|
||||||
trigger_active
|
external_clause external_body_clause_opt
|
||||||
trigger_type
|
|
||||||
trigger_position
|
|
||||||
ON symbol_table_name
|
|
||||||
external_clause external_body_clause_opt
|
|
||||||
{
|
{
|
||||||
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
||||||
$$->active = $2;
|
$$->active = $2;
|
||||||
@ -2973,31 +2911,20 @@ trigger_clause
|
|||||||
if ($8)
|
if ($8)
|
||||||
$$->source = toString($8);
|
$$->source = toString($8);
|
||||||
}
|
}
|
||||||
| symbol_trigger_name
|
| symbol_trigger_name FOR symbol_table_name trigger_active trigger_type trigger_position
|
||||||
FOR symbol_table_name
|
AS local_declaration_list full_proc_block
|
||||||
trigger_active
|
|
||||||
trigger_type
|
|
||||||
trigger_position
|
|
||||||
AS begin_trigger
|
|
||||||
local_declaration_list
|
|
||||||
full_proc_block
|
|
||||||
end_trigger
|
|
||||||
{
|
{
|
||||||
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
||||||
$$->active = $4;
|
$$->active = $4;
|
||||||
$$->type = $5;
|
$$->type = $5;
|
||||||
$$->position = $6;
|
$$->position = $6;
|
||||||
$$->relationName = toName($3);
|
$$->relationName = toName($3);
|
||||||
$$->source = toString($11);
|
$$->source = toString(makeParseStr(YYPOSNARG(7), YYPOSNARG(9)));
|
||||||
$$->localDeclList = $9;
|
$$->localDeclList = $8;
|
||||||
$$->body = $10;
|
$$->body = $9;
|
||||||
}
|
}
|
||||||
| symbol_trigger_name
|
| symbol_trigger_name FOR symbol_table_name trigger_active trigger_type trigger_position
|
||||||
FOR symbol_table_name
|
external_clause external_body_clause_opt
|
||||||
trigger_active
|
|
||||||
trigger_type
|
|
||||||
trigger_position
|
|
||||||
external_clause external_body_clause_opt
|
|
||||||
{
|
{
|
||||||
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
||||||
$$->active = $4;
|
$$->active = $4;
|
||||||
@ -3283,9 +3210,10 @@ alter_op : DROP simple_column_name drop_behaviour
|
|||||||
make_node(nod_del_default, (int) 0, NULL), NULL); }
|
make_node(nod_del_default, (int) 0, NULL), NULL); }
|
||||||
;
|
;
|
||||||
|
|
||||||
alter_column_name : keyword_or_column
|
alter_column_name
|
||||||
{ $$ = make_node (nod_field_name, (int) e_fln_count, NULL, $1); }
|
: keyword_or_column
|
||||||
;
|
{ $$ = make_node (nod_field_name, (int) e_fln_count, NULL, $1); }
|
||||||
|
;
|
||||||
|
|
||||||
// below are reserved words that could be used as column identifiers
|
// below are reserved words that could be used as column identifiers
|
||||||
// in the previous versions
|
// in the previous versions
|
||||||
@ -3467,14 +3395,8 @@ db_alter_clause
|
|||||||
// ALTER TRIGGER
|
// ALTER TRIGGER
|
||||||
|
|
||||||
alter_trigger_clause
|
alter_trigger_clause
|
||||||
: symbol_trigger_name
|
: symbol_trigger_name trigger_active trigger_type_opt trigger_position
|
||||||
trigger_active
|
AS local_declaration_list full_proc_block
|
||||||
trigger_type_opt
|
|
||||||
trigger_position
|
|
||||||
AS begin_trigger
|
|
||||||
local_declaration_list
|
|
||||||
full_proc_block
|
|
||||||
end_trigger
|
|
||||||
{
|
{
|
||||||
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
||||||
$$->alter = true;
|
$$->alter = true;
|
||||||
@ -3482,15 +3404,12 @@ alter_trigger_clause
|
|||||||
$$->active = $2;
|
$$->active = $2;
|
||||||
$$->type = $3;
|
$$->type = $3;
|
||||||
$$->position = $4;
|
$$->position = $4;
|
||||||
$$->source = toString($9);
|
$$->source = toString(makeParseStr(YYPOSNARG(5), YYPOSNARG(7)));
|
||||||
$$->localDeclList = $7;
|
$$->localDeclList = $6;
|
||||||
$$->body = $8;
|
$$->body = $7;
|
||||||
}
|
}
|
||||||
| symbol_trigger_name
|
| symbol_trigger_name trigger_active trigger_type_opt trigger_position
|
||||||
trigger_active
|
external_clause external_body_clause_opt
|
||||||
trigger_type_opt
|
|
||||||
trigger_position
|
|
||||||
external_clause external_body_clause_opt
|
|
||||||
{
|
{
|
||||||
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
||||||
$$->alter = true;
|
$$->alter = true;
|
||||||
@ -3502,10 +3421,7 @@ alter_trigger_clause
|
|||||||
if ($6)
|
if ($6)
|
||||||
$$->source = toString($6);
|
$$->source = toString($6);
|
||||||
}
|
}
|
||||||
| symbol_trigger_name
|
| symbol_trigger_name trigger_active trigger_type_opt trigger_position
|
||||||
trigger_active
|
|
||||||
trigger_type_opt
|
|
||||||
trigger_position
|
|
||||||
{
|
{
|
||||||
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
$$ = newNode<CreateAlterTriggerNode>(toName($1));
|
||||||
$$->alter = true;
|
$$->alter = true;
|
||||||
@ -6598,21 +6514,16 @@ namespace
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const TEXT* Parser::lex_position()
|
// Make a substring from the command text being parsed.
|
||||||
|
dsql_str* Parser::makeParseStr(const Position& p1, const Position& p2)
|
||||||
{
|
{
|
||||||
/**************************************
|
const char* start = p1.firstPos;
|
||||||
*
|
const char* end = p2.lastPos;
|
||||||
* l e x _ p o s i t i o n
|
|
||||||
*
|
|
||||||
**************************************
|
|
||||||
*
|
|
||||||
* Functional description
|
|
||||||
* Return the current position of LEX
|
|
||||||
* in the input string.
|
|
||||||
*
|
|
||||||
**************************************/
|
|
||||||
|
|
||||||
return lex.ptr;
|
string str;
|
||||||
|
transformString(start, end - start, str);
|
||||||
|
|
||||||
|
return MAKE_string(str.c_str(), str.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -6980,25 +6891,32 @@ static string toString(dsql_str* node)
|
|||||||
return string(node->str_data);
|
return string(node->str_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Parser::yylex()
|
// Set the position of a left-hand non-terminal based on its right-hand rules.
|
||||||
|
void Parser::yyReducePosn(YYPOSN& ret, YYPOSN* termPosns, YYSTYPE* /*termVals*/, int termNo,
|
||||||
|
int /*stkPos*/, int /*yychar*/, YYPOSN& yyposn, void*)
|
||||||
{
|
{
|
||||||
lex.prev_keyword = yylexAux();
|
if (termNo == 0)
|
||||||
return lex.prev_keyword;
|
ret = yyposn;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret.firstLine = termPosns[0].firstLine;
|
||||||
|
ret.firstColumn = termPosns[0].firstColumn;
|
||||||
|
ret.firstPos = termPosns[0].firstPos;
|
||||||
|
ret.lastLine = termPosns[termNo - 1].lastLine;
|
||||||
|
ret.lastColumn = termPosns[termNo - 1].lastColumn;
|
||||||
|
ret.lastPos = termPosns[termNo - 1].lastPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** This allows us to see colored output representing the position reductions.
|
||||||
|
printf("%.*s", ret.firstPos - lex.start, lex.start);
|
||||||
|
printf("\033[1;31m%.*s\033[1;37m", ret.lastPos - ret.firstPos, ret.firstPos);
|
||||||
|
printf("%s\n", ret.lastPos);
|
||||||
|
***/
|
||||||
}
|
}
|
||||||
|
|
||||||
int Parser::yylexAux()
|
int Parser::yylex()
|
||||||
{
|
{
|
||||||
/**************************************
|
|
||||||
*
|
|
||||||
* y y l e x A u x
|
|
||||||
*
|
|
||||||
**************************************
|
|
||||||
*
|
|
||||||
* Functional description: lexer.
|
|
||||||
*
|
|
||||||
**************************************/
|
|
||||||
UCHAR tok_class;
|
UCHAR tok_class;
|
||||||
char string[MAX_TOKEN_LEN];
|
|
||||||
SSHORT c;
|
SSHORT c;
|
||||||
|
|
||||||
// Find end of white space and skip comments
|
// Find end of white space and skip comments
|
||||||
@ -7076,6 +6994,25 @@ int Parser::yylexAux()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
yyposn.firstLine = lex.lines;
|
||||||
|
yyposn.firstColumn = lex.ptr - lex.line_start;
|
||||||
|
yyposn.firstPos = lex.ptr - 1;
|
||||||
|
|
||||||
|
lex.prev_keyword = yylexAux();
|
||||||
|
|
||||||
|
yyposn.lastLine = lex.lines;
|
||||||
|
yyposn.lastColumn = lex.ptr - lex.line_start;
|
||||||
|
yyposn.lastPos = lex.ptr;
|
||||||
|
|
||||||
|
return lex.prev_keyword;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Parser::yylexAux()
|
||||||
|
{
|
||||||
|
SSHORT c = lex.ptr[-1];
|
||||||
|
UCHAR tok_class = classes(c);
|
||||||
|
char string[MAX_TOKEN_LEN];
|
||||||
|
|
||||||
// Depending on tok_class of token, parse token
|
// Depending on tok_class of token, parse token
|
||||||
|
|
||||||
lex.last_token = lex.ptr - 1;
|
lex.last_token = lex.ptr - 1;
|
||||||
@ -7778,7 +7715,7 @@ void Parser::yyerror_detailed(const TEXT* /*error_string*/, int yychar, YYSTYPE&
|
|||||||
void Parser::yyerror(const TEXT* error_string)
|
void Parser::yyerror(const TEXT* error_string)
|
||||||
{
|
{
|
||||||
YYSTYPE errt_value;
|
YYSTYPE errt_value;
|
||||||
YYPOSN errt_posn = -1;
|
YYPOSN errt_posn;
|
||||||
yyerror_detailed(error_string, -1, errt_value, errt_posn);
|
yyerror_detailed(error_string, -1, errt_value, errt_posn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user