emit() sweep: finish conversion, converting 'strange func call' cases

Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
Jeff Garzik
2009-11-08 23:52:47 -05:00
committed by Jeff Garzik
parent ebcaf5895e
commit d5e59cd6db
3 changed files with 72 additions and 36 deletions

34
exec.c
View File

@ -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);

View File

@ -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
View File

@ -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, ...)
{