emit() sweep: finish conversion, converting 'strange func call' cases
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
34
exec.c
34
exec.c
@ -43,6 +43,18 @@ static const char *op_names[] = {
|
||||
[SEO_STRTOBIN] = "SEO_STRTOBIN",
|
||||
};
|
||||
|
||||
static const char *interval_names[] = {
|
||||
[SDI_DAY_HOUR] = "SDI_DAY_HOUR",
|
||||
[SDI_DAY_MICROSECOND] = "SDI_DAY_MICROSECOND",
|
||||
[SDI_DAY_MINUTE] = "SDI_DAY_MINUTE",
|
||||
[SDI_DAY_SECOND] = "SDI_DAY_SECOND",
|
||||
[SDI_YEAR_MONTH] = "SDI_YEAR_MONTH",
|
||||
[SDI_YEAR] = "SDI_YEAR",
|
||||
[SDI_HOUR_MICROSECOND] = "SDI_HOUR_MICROSECOND",
|
||||
[SDI_HOUR_MINUTE] = "SDI_HOUR_MINUTE",
|
||||
[SDI_HOUR_SECOND] = "SDI_HOUR_SECOND",
|
||||
};
|
||||
|
||||
void sqlp_alias(const char *alias)
|
||||
{
|
||||
printf("exec ALIAS %s\n", alias);
|
||||
@ -66,6 +78,23 @@ void sqlp_bool(int val)
|
||||
printf("exec BOOL %d\n", val);
|
||||
}
|
||||
|
||||
void sqlp_call(int n_args, const char *name)
|
||||
{
|
||||
printf("exec CALL %d %s\n", n_args, name);
|
||||
}
|
||||
|
||||
void sqlp_call_date(int n_args, enum sqlp_expr_ops op)
|
||||
{
|
||||
printf("exec CALL %d DATE %s\n",
|
||||
n_args,
|
||||
op == SEO_ADD ? "ADD" : "SUB");
|
||||
}
|
||||
|
||||
void sqlp_call_trim_opts(int trim_opts)
|
||||
{
|
||||
printf("exec CALL TRIM OPTS %d\n", trim_opts);
|
||||
}
|
||||
|
||||
void sqlp_case(int n_list, int have_else)
|
||||
{
|
||||
printf("exec CASE %d %d\n", n_list, have_else);
|
||||
@ -171,6 +200,11 @@ void sqlp_create_tbl_sel(int temp, int if_n_exists, int n_cols,
|
||||
name);
|
||||
}
|
||||
|
||||
void sqlp_date_interval(enum sqlp_date_intervals interval)
|
||||
{
|
||||
printf("exec DATE-INTERVAL %s\n", interval_names[interval]);
|
||||
}
|
||||
|
||||
void sqlp_def_col(int flags, const char *name)
|
||||
{
|
||||
printf("exec DEFINE-COL %d %s\n", flags, name);
|
||||
|
16
sql-parser.h
16
sql-parser.h
@ -40,10 +40,25 @@ enum sqlp_expr_ops {
|
||||
SEO_STRTOBIN = 23,
|
||||
};
|
||||
|
||||
enum sqlp_date_intervals {
|
||||
SDI_DAY_HOUR = 0,
|
||||
SDI_DAY_MICROSECOND = 1,
|
||||
SDI_DAY_MINUTE = 2,
|
||||
SDI_DAY_SECOND = 3,
|
||||
SDI_YEAR_MONTH = 4,
|
||||
SDI_YEAR = 5,
|
||||
SDI_HOUR_MICROSECOND = 6,
|
||||
SDI_HOUR_MINUTE = 7,
|
||||
SDI_HOUR_SECOND = 8,
|
||||
};
|
||||
|
||||
extern void sqlp_alias(const char *alias);
|
||||
extern void sqlp_assign(const char *db_name, const char *name);
|
||||
extern void sqlp_assign_at(const char *name);
|
||||
extern void sqlp_bool(int val);
|
||||
extern void sqlp_call(int n_args, const char *name);
|
||||
extern void sqlp_call_date(int n_args, enum sqlp_expr_ops op);
|
||||
extern void sqlp_call_trim_opts(int trim_opts);
|
||||
extern void sqlp_case(int n_list, int have_else);
|
||||
extern void sqlp_caseval(int n_list, int have_else);
|
||||
extern void sqlp_col_attr(enum sqlp_col_attribs attr);
|
||||
@ -65,6 +80,7 @@ extern void sqlp_create_tbl(int temp, int if_n_exists, int n_cols,
|
||||
extern void sqlp_create_tbl_sel(int temp, int if_n_exists, int n_cols,
|
||||
const char *db_name, const char *name);
|
||||
extern void sqlp_create_sel(int ignore_replace);
|
||||
extern void sqlp_date_interval(enum sqlp_date_intervals interval);
|
||||
extern void sqlp_def_col(int flags, const char *name);
|
||||
extern void sqlp_delete(int opts, const char *name);
|
||||
extern void sqlp_delete_multi(int opts, int n_del, int n_tbl_ref);
|
||||
|
58
sql.y
58
sql.y
@ -332,7 +332,6 @@ typedef struct YYLTYPE {
|
||||
%{
|
||||
void yyerror(char *s, ...);
|
||||
void lyyerror(YYLTYPE, char *s, ...);
|
||||
void emit(char *s, ...);
|
||||
%}
|
||||
/* free discarded tokens */
|
||||
%destructor { printf ("free at %d %s\n",@$.first_line, $$); free($$); } <strval>
|
||||
@ -909,38 +908,38 @@ expr: expr IN '(' val_list ')' { sqlp_expr_is_in($4); }
|
||||
| EXISTS '(' select_stmt ')' { sqlp_expr_op(SEO_EXISTS); if($1)sqlp_expr_op(SEO_NOT); }
|
||||
;
|
||||
|
||||
expr: NAME '(' opt_val_list ')' { emit("CALL %d %s", $3, $1); free($1); }
|
||||
expr: NAME '(' opt_val_list ')' { sqlp_call($3, $1); free($1); }
|
||||
;
|
||||
|
||||
/* functions with special syntax */
|
||||
expr: FCOUNT '(' '*' ')' { emit("COUNTALL") }
|
||||
| FCOUNT '(' expr ')' { emit(" CALL 1 COUNT"); }
|
||||
expr: FCOUNT '(' '*' ')' { sqlp_call(0, "COUNTALL") }
|
||||
| FCOUNT '(' expr ')' { sqlp_call(1, "COUNT"); }
|
||||
|
||||
expr: FSUBSTRING '(' val_list ')' { emit("CALL %d SUBSTR", $3);}
|
||||
| FSUBSTRING '(' expr FROM expr ')' { emit("CALL 2 SUBSTR"); }
|
||||
| FSUBSTRING '(' expr FROM expr FOR expr ')' { emit("CALL 3 SUBSTR"); }
|
||||
| FTRIM '(' val_list ')' { emit("CALL %d TRIM", $3); }
|
||||
| FTRIM '(' trim_ltb expr FROM val_list ')' { emit("CALL 3 TRIM"); }
|
||||
expr: FSUBSTRING '(' val_list ')' { sqlp_call($3, "SUBSTR");}
|
||||
| FSUBSTRING '(' expr FROM expr ')' { sqlp_call(2, "SUBSTR"); }
|
||||
| FSUBSTRING '(' expr FROM expr FOR expr ')' { sqlp_call(3, "SUBSTR"); }
|
||||
| FTRIM '(' val_list ')' { sqlp_call($3, "TRIM"); }
|
||||
| FTRIM '(' trim_ltb expr FROM val_list ')' { sqlp_call(3, "TRIM"); }
|
||||
;
|
||||
|
||||
trim_ltb: LEADING { emit("INT 1"); }
|
||||
| TRAILING { emit("INT 2"); }
|
||||
| BOTH { emit("INT 3"); }
|
||||
trim_ltb: LEADING { sqlp_call_trim_opts(0); }
|
||||
| TRAILING { sqlp_call_trim_opts(1); }
|
||||
| BOTH { sqlp_call_trim_opts(2); }
|
||||
;
|
||||
|
||||
expr: FDATE_ADD '(' expr ',' interval_exp ')' { emit("CALL 3 DATE_ADD"); }
|
||||
| FDATE_SUB '(' expr ',' interval_exp ')' { emit("CALL 3 DATE_SUB"); }
|
||||
expr: FDATE_ADD '(' expr ',' interval_exp ')' { sqlp_call_date(3, SEO_ADD); }
|
||||
| FDATE_SUB '(' expr ',' interval_exp ')' { sqlp_call_date(3, SEO_SUB); }
|
||||
;
|
||||
|
||||
interval_exp: INTERVAL expr DAY_HOUR { emit("NUMBER 1"); }
|
||||
| INTERVAL expr DAY_MICROSECOND { emit("NUMBER 2"); }
|
||||
| INTERVAL expr DAY_MINUTE { emit("NUMBER 3"); }
|
||||
| INTERVAL expr DAY_SECOND { emit("NUMBER 4"); }
|
||||
| INTERVAL expr YEAR_MONTH { emit("NUMBER 5"); }
|
||||
| INTERVAL expr YEAR { emit("NUMBER 6"); }
|
||||
| INTERVAL expr HOUR_MICROSECOND { emit("NUMBER 7"); }
|
||||
| INTERVAL expr HOUR_MINUTE { emit("NUMBER 8"); }
|
||||
| INTERVAL expr HOUR_SECOND { emit("NUMBER 9"); }
|
||||
interval_exp: INTERVAL expr DAY_HOUR { sqlp_date_interval(SDI_DAY_HOUR); }
|
||||
| INTERVAL expr DAY_MICROSECOND { sqlp_date_interval(SDI_DAY_MICROSECOND); }
|
||||
| INTERVAL expr DAY_MINUTE { sqlp_date_interval(SDI_DAY_MINUTE); }
|
||||
| INTERVAL expr DAY_SECOND { sqlp_date_interval(SDI_DAY_SECOND); }
|
||||
| INTERVAL expr YEAR_MONTH { sqlp_date_interval(SDI_YEAR_MONTH); }
|
||||
| INTERVAL expr YEAR { sqlp_date_interval(SDI_YEAR); }
|
||||
| INTERVAL expr HOUR_MICROSECOND { sqlp_date_interval(SDI_HOUR_MICROSECOND); }
|
||||
| INTERVAL expr HOUR_MINUTE { sqlp_date_interval(SDI_HOUR_MINUTE); }
|
||||
| INTERVAL expr HOUR_SECOND { sqlp_date_interval(SDI_HOUR_SECOND); }
|
||||
;
|
||||
|
||||
expr: CASE expr case_list END { sqlp_caseval($3, 0); }
|
||||
@ -971,19 +970,6 @@ expr: BINARY expr %prec UMINUS { sqlp_expr_op(SEO_STRTOBIN); }
|
||||
|
||||
%%
|
||||
|
||||
void
|
||||
emit(char *s, ...)
|
||||
{
|
||||
extern yylineno;
|
||||
|
||||
va_list ap;
|
||||
va_start(ap, s);
|
||||
|
||||
printf("rpn: ");
|
||||
vfprintf(stdout, s, ap);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void
|
||||
yyerror(char *s, ...)
|
||||
{
|
||||
|
Reference in New Issue
Block a user