📄 bug.y
字号:
tblelmtlist: createclause
{T( $$ = pa_table_element( NULL, $1 ); )}
| tblelmtlist T_COMMA createclause
{T( $$ = pa_table_element( $1, $3 ); )}
;
createclause: coldefn
{T( $$.ptr = $1;
$$.info = PI_COLDEFN;
)}
| T_UNIQUE T_LPAREN collist T_RPAREN
{ pa_specific( L_PACE );
T( $$.info = PI_UNIQUE;
$$.ptr = $3;
)}
| T_PRIMARY T_KEY T_LPAREN collist T_RPAREN
{ pa_specific( L_PACE );
T( $$.info = PI_PRIMARYKEY;
$$.ptr = $4;
)}
| rolename notnull T_FOREIGN T_KEY T_FOR
tabname fgnkeycols checkclause
{ pa_specific( L_PACE );
T( $$.info = PI_FOREIGNKEY;
$$.ptr = pa_foreign_key( $1, $2, $8, $6, $7 );
)}
| rolename notnull T_FOREIGN T_KEY rolename notnull
fgnkeycols T_REFERENCES tabname
{ pa_specific( L_PACE ); }
;
coldefn: colname data_type notnull unique
{T( $$ = pa_coldefn( $1, $2, !$3, $4 ); )}
;
notnull: /* empty */
{T( $$ = FALSE; )}
| T_NOT T_NULL
{T( $$ = TRUE; )}
;
checkclause: T_CHECK T_ON T_COMMIT
{T( $$ = TRUE; )}
| /* empty */
{T( $$ = FALSE; )}
;
rolename: /* empty */
{T( $$ = NULL; )}
| colname
;
fgnkeycols: /* empty */
{T( $$ = NULL; )}
| T_LPAREN fgnkeycollist optcomma T_RPAREN
{T( $$ = $2; )}
;
fgnkeycollist: fgnkeycol
{T( $$ = pa_iadd_plist( NULL, $1 ); )}
| fgnkeycollist T_COMMA fgnkeycol
{T( $$ = pa_iadd_plist( $1, $3 ); )}
;
fgnkeycol: colname T_IS colname
{T( $$ = pa_foreign_key_column( $1, $3 ); )}
;
createindex: T_CREATE unique T_INDEX indexname T_ON tabname
T_LPAREN indexlist T_RPAREN
{T( $$ = pa_create_index( $2, $4, $6, $8 ); )}
;
unique: /* empty */
{T( $$ = FALSE; )}
| T_UNIQUE
{T( $$ = TRUE; )}
;
indexlist: indexlistrev optcomma
{T( $$ = pa_reverse_plist( $1 ); )}
;
indexlistrev: indexcol
{T( $$ = pa_iadd_plist( NULL, $1 ); )}
| indexlistrev T_COMMA indexcol
{T( $$ = pa_iadd_plist( $1, $3 ); )}
;
indexcol: colname indexattrlist
{T( $$ = pa_index_column( $1, $2 ); )}
;
indexattrlist: /* empty */
{ $$ = IA_ASC; }
| indexattrlist1
{ $$ = $1; }
;
indexattrlist1: indexattr
{ $$ = $1; }
| indexattrlist1 indexattr
{ $$ = ( $1 | $2 );
if( ($$ & IA_ASC) && ($$ & IA_DESC)){
sql_errors( SQLE_SYNTAX_ERROR, "DESC" );
}
}
;
indexattr: T_ASC
{ $$ = IA_ASC; }
| T_DESC
{ $$ = IA_DESC; }
;
createview: T_CREATE T_VIEW tabname columns T_AS query_expr
{T( $$ = pa_create_view( $3, $4, $6 ); )}
;
alter: T_ALTER T_TABLE tabname alter_clause
{T( $$ = pa_alter_table( $3, $4 ); )}
;
alter_clause: T_ADD createclause
{T( $$ = pa_alter_clause( AC_ADD, $2, NULL ); )}
| T_MODIFY modcoldefn
{ a_parser_info i;
pa_specific( L_PACE | L_XQL );
T( i.info = PI_COLDEFN;
i.ptr = $2;
$$ = pa_alter_clause( AC_MODIFY, i, NULL );
)}
| alter_delete colname
{ a_parser_info i;
pa_specific( L_XQL | L_PACE );
T( i.info = PI_COLDEFN;
i.ptr = pa_coldefn( $2, NULL, FALSE, FALSE );
$$ = pa_alter_clause( AC_DELETE, i, NULL );
)}
| alter_delete T_FOREIGN T_KEY T_IDENTIFIER
{ a_parser_info i;
pa_specific( L_PACE );
T( i.info = PI_FOREIGNKEY;
i.ptr = $4;
$$ = pa_alter_clause( AC_DELETE_FKEY, i, NULL );
)}
| alter_delete T_PRIMARY T_KEY
{ a_parser_info i;
pa_specific( L_PACE );
T( i.info = PI_PRIMARYKEY;
$$ = pa_alter_clause( AC_DELETE_PKEY, i, NULL );
)}
| T_RENAME T_IDENTIFIER
{ a_parser_info i;
pa_specific( L_PACE );
T( i.info = PI_NONE;
i.ptr = $2;
$$ = pa_alter_clause( AC_NEWNAME, i, NULL );
)}
| T_RENAME T_IDENTIFIER T_TO T_IDENTIFIER
{ a_parser_info i;
pa_specific( L_PACE );
T( i.info = PI_NONE;
i.ptr = $2;
$$ = pa_alter_clause( AC_RENAME, i, $4 );
)}
;
alter_delete: T_DELETE
| T_DROP
;
modcoldefn: coldefn
| colname T_NOT T_NULL
{T( $$ = pa_coldefn( $1,
pa_data_type( DT_NOTYPE, 0L, 0 ),
FALSE, FALSE ); )}
| colname T_NULL
{T( $$ = pa_coldefn( $1,
pa_data_type( DT_NOTYPE, 0L, 0 ),
TRUE, FALSE ); )}
;
data_type: char_type T_LPAREN integer T_RPAREN
{T( $$ = pa_data_type( $1, ((an_integer *)$3)->value, 0 );)}
| char_type
{T( $$ = pa_data_type( $1, 1L, 0 ); )}
| T_LONG T_VARCHAR
{T( $$ = pa_data_type( DT_LONGVARCHAR, -1L, 0 ); )}
| integer_type
{T( $$ = pa_data_type( $1, 0L, 0 ); )}
| exact_num_type T_LPAREN integer T_COMMA integer T_RPAREN
{T( $$ = pa_data_type( $1,
((an_integer *)$3)->value,
(unsigned short)((an_integer *)$5)->value ); )}
| exact_num_type T_LPAREN integer T_RPAREN
{T( $$ = pa_data_type( $1, ((an_integer *)$3)->value, 0 );)}
| exact_num_type
{T( $$ = pa_data_type( $1, -1L, 0 ); )}
| float_type
{T( $$ = pa_data_type( $1, 0L, 0 ); )}
| float_type T_LPAREN integer T_RPAREN
{T( $$ = pa_data_type( $1, ((an_integer *)$3)->value, 0 );)}
| T_DATE
{T( $$ = pa_data_type( DT_DATE, 0L, 0 ); )}
;
char_type: T_CHAR
{T( $$ = DT_FIXCHAR; )}
| T_VARCHAR
{T( $$ = DT_VARCHAR; )}
;
integer_type: T_INTEGER
{T( $$ = DT_INT; )}
| T_SMALLINT
{T( $$ = DT_SMALLINT; )}
;
exact_num_type: T_DECIMAL
{T( $$ = DT_DECIMAL; )}
| T_NUMERIC
{T( $$ = DT_DECIMAL; )}
;
float_type: T_FLOAT
{T( $$ = DT_FLOAT; )}
| T_REAL
{T( $$ = DT_FLOAT; )}
| T_DOUBLE
{T( $$ = DT_DOUBLE; )}
| T_DOUBLE T_PRECISION
{T( $$ = DT_DOUBLE; )}
;
number: T_NUMBER
{T( $$ = pa_number( $1 ); )}
| T_LONGINT
{T( $$ = pa_integer( $1 ); )}
;
integer: T_LONGINT
{ $$ = pa_integer( $1 ); }
;
commenton: T_COMMENT T_ON T_TABLE tabname T_IS runid_spec
{ pa_specific( L_SAA ); }
| T_COMMENT T_ON T_COLUMN colref T_IS runid_spec
{ pa_specific( L_SAA ); }
;
lock: T_LOCK T_TABLE tabname T_IN lockmode
{ pa_specific( L_SAA ); }
;
lockmode: T_SHARE
| T_EXCLUSIVE
;
droptable: T_DROP T_TABLE tabname
{T( $$ = pa_droptable( $3 ); )}
;
dropindex: T_DROP T_INDEX indexname
{T( $$ = pa_dropindex( $3 ); )}
;
dropview: T_DROP T_VIEW tabname
{T( $$ = pa_dropview( $3 ); )}
;
grant: granttok tableprivileges T_ON tabname
T_TO userlist grantoption
{T( $$ = pa_grant( PRIVT_TABLE, (a_privilege)$2, $4,
update_collist, $6, $7 ); )}
/*
| granttok T_RUN T_ON progname T_TO userlist grantoption
{ pa_specific( L_PACE );
T( $$ = pa_grant( PRIVT_RUN, (a_privilege)0, $4,
NULL, $6, $7 );
)}
*/
| granttok specialpriv T_TO userlist passwdlist
{ pa_specific( L_PACE | L_XQL );
T( $$ = pa_grant( PRIVT_SPECIAL, (a_privilege)$2, NULL,
$5, $4, FALSE );
)}
;
granttok: T_GRANT
{T( update_collist = NULL; )}
;
tableprivileges:T_ALL
{T( $$ = PRIV_ALL; )}
| T_ALL T_PRIVILEGES
{ pa_specific( L_PACE );
T( $$ = PRIV_ALL;
)}
| tableprivlist optcomma
;
tableprivlist: tablepriv
| tableprivlist T_COMMA tablepriv
{T( $$ = ( $1 | $3 ); )}
;
tablepriv: T_ALTER
{T( $$ = PRIV_ALTER; )}
| T_DELETE
{T( $$ = PRIV_DELETE; )}
| T_INDEX
{T( $$ = PRIV_INDEX; )}
| T_INSERT
{T( $$ = PRIV_INSERT; )}
| T_SELECT priv_columns
{ if( $2 != NULL ){
pa_specific( L_PACE | L_XQL );
}
T( $$ = PRIV_SELECT; )}
| T_UPDATE priv_columns
{ if( $2 != NULL ){
pa_specific( L_PACE | L_XQL );
}
T( if( $2 != NULL ){
$$ = PRIV_UPDATECOL;
}else{
$$ = PRIV_UPDATE;
}
update_collist = $2;
)}
;
priv_columns: columns
| collist
;
specialpriv: T_CONNECT
{T( $$ = PRIV_CONNECT; )}
| T_DBA
{T( $$ = PRIV_DBA; )}
| T_RESOURCE
{T( $$ = PRIV_RESOURCE; )}
| T_SCHEDULE
{T( $$ = PRIV_SCHEDULE; )}
;
grantoption: /* empty */
{T( $$ = FALSE; )}
| T_WITH T_GRANT T_OPTION
{T( $$ = TRUE; )}
;
userlist: userlistrev optcomma
{T( $$ = pa_reverse_plist( $1 ); )}
;
userlistrev: userid
{T( $$ = pa_add_plist( NULL, $1 ); )}
| userlistrev T_COMMA userid
{T( $$ = pa_add_plist( $1, $3 ); )}
;
userid: T_IDENTIFIER
| T_PUBLIC
{T( $$ = NULL; )}
;
passwdlist: /* empty */
{T( $$ = NULL; )}
| T_IDENTIFIED T_BY passwdlistrev optcomma
{T( $$ = pa_reverse_plist( $3 ); )}
;
passwdlistrev: password
{T( $$ = pa_add_plist( NULL, $1 ); )}
| passwdlistrev T_COMMA password
{T( $$ = pa_add_plist( $1, $3 ); )}
;
password: T_IDENTIFIER
;
revoke: revoketok tableprivileges T_ON tabname T_FROM userlist
{T( $$ = pa_revoke( PRIVT_TABLE, (a_privilege)$2, $4,
update_collist,$6 );)}
/*
| revoketok T_RUN T_ON progname T_FROM userlist
{ pa_specific( L_PACE );
T( $$ = pa_revoke( PRIVT_RUN, (a_privilege)0, $4,
NULL, $6 );
)}
*/
| revoketok specialpriv T_FROM userlist
{ pa_specific( L_PACE | L_XQL );
T( $$ = pa_revoke( PRIVT_SPECIAL, (a_privilege)$2, NULL,
NULL, $4 );
)}
;
revoketok: T_REVOKE
{T( update_collist = NULL; )}
;
dbspacename: T_IDENTIFIER
{T( $$ = pa_dbspace( NULL, $1 ); )}
| T_IDENTIFIER T_DOT T_IDENTIFIER
{T( $$ = pa_dbspace( $1, $3 ); )}
;
commit: T_COMMIT T_WORK T_RELEASE
{ $$ = pa_commit( TRUE ); }
| T_COMMIT T_WORK
{ $$ = pa_commit( FALSE ); }
| T_COMMIT
{ $$ = pa_commit( FALSE ); }
;
rollback: T_ROLLBACK T_WORK T_RELEASE
{ $$ = pa_rollback( TRUE ); }
| T_ROLLBACK T_WORK
{ $$ = pa_rollback( FALSE ); }
| T_ROLLBACK
{ $$ = pa_rollback( FALSE ); }
;
sqlprogram: stmt
| sqlprogram stmt
;
stmt: validstmt T_SEMI_COLON
{ pa_end_instr( TRUE ); }
| error errortoklist T_SEMI_COLON
{ pa_end_instr( TRUE );
yyerrok; }
;
validstmt: execsql embstmt
| execsql runstmt
;
embstmt: embsqlstmt
/* taken out because of garbage at the end of statement */
/* { pa_end_instr( TRUE ); } */
;
runstmt: sqlstmt
{ if( SQLStmt ){
pa_sqlstmt();
}
/* taken out because of garbage at the end of statement */
/* pa_end_instr( TRUE ); */
}
;
errortoklist: toklist
{ if( SQLStmt ){
pa_sqlstmt();
}
/* taken out because of garbage at the end of statement */
/* pa_end_instr( TRUE ); */
}
;
toklist: /* empty */
| toklist token
;
token: T_TOK
| hostvar
| T_COMMA
| selinto2
;
execsql: T_EXECSQL
{ $$ = pa_start_instr();
SQLStmt = TRUE;
}
;
embsqlstmt: { SQLStmt = FALSE; } close
| { SQLStmt = FALSE; } connect
| { SQLStmt = FALSE; } declarations
| { SQLStmt = FALSE; } declare
| { SQLStmt = FALSE; } describe
| dropstmt
| { SQLStmt = FALSE; } execute
| { SQLStmt = FALSE; } fetch
| { SQLStmt = FALSE; } getoption
| { SQLStmt = FALSE; } include
| { SQLStmt = FALSE; } open
| { SQLStmt = FALSE; } prepare
| put
| { SQLStmt = FALSE; } reopen
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -