Changeset: 8676cf8326bd for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8676cf8326bd Modified Files: sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_optimizer.c sql/backends/monet5/sql_optimizer.h sql/backends/monet5/sql_scenario.c sql/server/rel_psm.c sql/server/rel_semantic.c sql/server/sql_parser.h sql/server/sql_parser.y sql/server/sql_scan.c sql/storage/store.c Branch: default Log Message:
implemented 'Analyze' keyword. ANALYZE schema.[table [(column,...,columnN)]] [ SAMPLE size ] diffs (truncated from 312 to 300 lines): diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -2359,9 +2359,8 @@ backend_dumpproc(backend *be, Client c, q->token = REMsymbol; // will be patched q = pushStr(mb, q, t); GDKfree(tt); - q = pushStr(mb, q, pipe= initSQLoptimizer()); + q = pushStr(mb, q, pipe= getSQLoptimizer(be->mvc)); m->Tparse = 0; - GDKfree(pipe); } if (cq) addQueryToCache(c); diff --git a/sql/backends/monet5/sql_optimizer.c b/sql/backends/monet5/sql_optimizer.c --- a/sql/backends/monet5/sql_optimizer.c +++ b/sql/backends/monet5/sql_optimizer.c @@ -210,27 +210,16 @@ SQLgetStatistics(Client cntxt, mvc *m, M GDKfree(old); optimizerCheck(cntxt,mb,"optimizer.SQLgetstatistics",actions,GDKusec()-clk,0); } -/* - * Optimizers steps are identified by a pipeline name. The default pipeline in the distribution has been - * tested extensively and should provide overall good performance. - * Additional pipelines are defined in the opt_pipes.mx file. - * - */ -static str optimizerpipe; /* the active pipeline */ str -initSQLoptimizer(void) +getSQLoptimizer(mvc *m) { - char *pipe; + ValRecord *val = stack_get_var(m,"optimizer"); + char *pipe = "default_pipe"; - /* do nothing if the pipe line is already set */ - if (optimizerpipe == NULL ){ - pipe = GDKgetenv("sql_optimizer"); - if ( pipe == NULL) - optimizerpipe = GDKstrdup("default_pipe"); - else optimizerpipe= GDKstrdup(pipe); - } - return GDKstrdup(optimizerpipe); + if (val && val->val.sval) + pipe = val->val.sval; + return pipe; } void @@ -260,13 +249,12 @@ addQueryToCache(Client c) { MalBlkPtr mb; mvc *m; - ValRecord *val; backend *be; - str msg = 0; + str msg = 0, pipe; be = (backend *) c->sqlcontext; assert( be && be->mvc ); /* SQL clients should always have their state set */ - val = stack_get_var(be->mvc,"optimizer"); + pipe = getSQLoptimizer(be->mvc); insertSymbol(c->nspace, c->curprg); trimMalBlk(c->curprg->def); @@ -292,7 +280,7 @@ addQueryToCache(Client c) runMALDebugger(c,c->curprg); return; } - addOptimizers(c, mb, val->val.sval); + addOptimizers(c, mb, pipe); SQLgetStatistics(c,m,mb); if ( m->emod & mod_debug ) addtoMalBlkHistory(mb,"getStatistics"); diff --git a/sql/backends/monet5/sql_optimizer.h b/sql/backends/monet5/sql_optimizer.h --- a/sql/backends/monet5/sql_optimizer.h +++ b/sql/backends/monet5/sql_optimizer.h @@ -26,7 +26,7 @@ sql5_export void addQueryToCache(Client c); sql5_export str SQLoptimizer(Client c); sql5_export void SQLsetAccessMode(Client c); -sql5_export str initSQLoptimizer(void); +sql5_export str getSQLoptimizer(mvc *m); sql5_export void addOptimizers(Client c,MalBlkPtr mb, char *pipe); #endif /* _SQL_OPTIMIZER_H_ */ diff --git a/sql/backends/monet5/sql_scenario.c b/sql/backends/monet5/sql_scenario.c --- a/sql/backends/monet5/sql_scenario.c +++ b/sql/backends/monet5/sql_scenario.c @@ -282,10 +282,12 @@ global_variables(mvc *sql, char *user, c SQLglobal("current_schema", schema); SQLglobal("current_user", user); SQLglobal("current_role", user); + /* inherit the optimizer from the server */ - opt = initSQLoptimizer(); + opt = GDKgetenv("sql_optimizer"); + if (!opt) + opt = "default_pipe"; SQLglobal("optimizer", opt); - GDKfree(opt); SQLglobal("trace","show,ticks,stmt"); typename = "sec_interval"; diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c --- a/sql/server/rel_psm.c +++ b/sql/server/rel_psm.c @@ -1060,6 +1060,84 @@ drop_trigger(mvc *sql, dlist *qname) return rel_drop_trigger(sql, ss->base.name, tname); } +static sql_rel * +psm_analyze(mvc *sql, dlist *qname, dlist *columns, symbol *sample ) +{ + exp_kind ek = {type_value, card_value, FALSE}; + sql_exp *sample_exp = NULL, *call; + char *sname = NULL, *tname = NULL; + list *tl = sa_list(sql->sa); + list *exps = sa_list(sql->sa), *analyze_calls = sa_list(sql->sa); + sql_subfunc *f = NULL; + + if (sample) { + sql_subtype *tpe = sql_bind_localtype("lng"); + + sample_exp = rel_value_exp( sql, NULL, sample, 0, ek); + sample_exp = rel_check_type(sql, tpe, sample_exp, type_cast); + } + if (qname) { + if (qname->h->next) + sname = qname_schema(qname); + else + sname = qname_table(qname); + if (!sname) + sname = cur_schema(sql)->base.name; + if (qname->h->next) + tname = qname_table(qname); + } + /* call analyze( [schema, [ table ]], opt_sample_size ) */ + if (sname) { + sql_exp *sname_exp = exp_atom_clob(sql->sa, sname); + + append(exps, sname_exp); + append(tl, exp_subtype(sname_exp)); + } + if (tname) { + sql_exp *tname_exp = exp_atom_clob(sql->sa, tname); + + append(exps, tname_exp); + append(tl, exp_subtype(tname_exp)); + + if (columns) + append(tl, exp_subtype(tname_exp)); + } + if (!columns) { + if (sample_exp) { + append(exps, sample_exp); + append(tl, exp_subtype(sample_exp)); + } + f = sql_bind_func_(sql->sa, mvc_bind_schema(sql, "sys"), "analyze", tl, F_PROC); + if (!f) + return sql_error(sql, 01, "Analyze procedure missing"); + call = exp_op(sql->sa, exps, f); + append(analyze_calls, call); + } else { + dnode *n; + + if (sample_exp) + append(tl, exp_subtype(sample_exp)); + f = sql_bind_func_(sql->sa, mvc_bind_schema(sql, "sys"), "analyze", tl, F_PROC); + + if (!f) + return sql_error(sql, 01, "Analyze procedure missing"); + for( n = columns->h; n; n = n->next) { + char *cname = n->data.sval; + list *nexps = list_dup(exps, NULL); + sql_exp *cname_exp = exp_atom_clob(sql->sa, cname); + + append(nexps, cname_exp); + if (sample_exp) + append(nexps, sample_exp); + /* call analyze( sname, tname, cname, opt_sample_size ) */ + call = exp_op(sql->sa, nexps, f); + append(analyze_calls, call); + } + } + return rel_psm_block(sql->sa, analyze_calls); +} + + sql_rel * rel_psm(mvc *sql, symbol *s) { @@ -1122,6 +1200,12 @@ rel_psm(mvc *sql, symbol *s) } break; + case SQL_ANALYZE: { + dlist *l = s->data.lval; + + ret = psm_analyze(sql, l->h->data.lval /* qualified table name */, l->h->next->data.lval /* opt list of column */, l->h->next->next->data.sym /* opt_sample_size */); + sql->type = Q_UPDATE; + } break; default: return sql_error(sql, 01, "schema statement unknown symbol(" PTRFMT ")->token = %s", PTRFMTCAST s, token2string(s->token)); } diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c --- a/sql/server/rel_semantic.c +++ b/sql/server/rel_semantic.c @@ -211,6 +211,8 @@ rel_semantic(mvc *sql, symbol *s) case SQL_CREATE_TRIGGER: case SQL_DROP_TRIGGER: + + case SQL_ANALYZE: return rel_psm(sql, s); case SQL_INSERT: diff --git a/sql/server/sql_parser.h b/sql/server/sql_parser.h --- a/sql/server/sql_parser.h +++ b/sql/server/sql_parser.h @@ -57,6 +57,7 @@ typedef enum tokens { SQL_DROP_COLUMN, SQL_DROP_CONSTRAINT, SQL_DROP_DEFAULT, + SQL_ANALYZE, SQL_DECLARE, SQL_SET, SQL_CALL, diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y --- a/sql/server/sql_parser.y +++ b/sql/server/sql_parser.y @@ -537,7 +537,7 @@ SQLCODE SQLERROR UNDER WHENEVER %token CHECK CONSTRAINT CREATE %token TYPE PROCEDURE FUNCTION AGGREGATE RETURNS EXTERNAL sqlNAME DECLARE %token CALL LANGUAGE -%token SQL_EXPLAIN SQL_PLAN SQL_DEBUG SQL_TRACE SQL_DOT PREPARE EXECUTE +%token ANALYZE SQL_EXPLAIN SQL_PLAN SQL_DEBUG SQL_TRACE SQL_DOT PREPARE EXECUTE %token DEFAULT DISTINCT DROP %token FOREIGN %token RENAME ENCRYPTED UNENCRYPTED PASSWORD GRANT REVOKE ROLE ADMIN INTO @@ -678,6 +678,12 @@ sql: | alter_statement | declare_statement | set_statement + | ANALYZE qname opt_column_list opt_sample + { dlist *l = L(); + append_list(l, $2); + append_list(l, $3); + append_symbol(l, $4); + $$ = _symbol_create_list( SQL_ANALYZE, l); } | call_procedure_statement ; @@ -1935,6 +1941,7 @@ routine_invocation: { dlist *l = L(); append_list( l, $1); append_list( l, $3); + assert(0); $$ = _symbol_create_list( SQL_FUNC, l); } ; @@ -3636,7 +3643,7 @@ qfunc: ; func_ident: - IDENT { $$ = $1; } + ident { $$ = $1; } | LEFT { $$ = sa_strdup(SA, "left"); } | RIGHT { $$ = sa_strdup(SA, "right"); } | INSERT { $$ = sa_strdup(SA, "insert"); } @@ -4774,6 +4781,7 @@ non_reserved_word: | URI { $$ = sa_strdup(SA, "uri"); } | FILTER { $$ = sa_strdup(SA, "filter"); } | TEMPORARY { $$ = sa_strdup(SA, "temporary"); } +| ANALYZE { $$ = sa_strdup(SA, "analyze"); } ; name_commalist: diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c --- a/sql/server/sql_scan.c +++ b/sql/server/sql_scan.c @@ -284,6 +284,7 @@ scanner_init_keywords(void) keywords_insert("CALL", CALL); keywords_insert("LANGUAGE", LANGUAGE); + keywords_insert("ANALYZE", ANALYZE); keywords_insert("EXPLAIN", SQL_EXPLAIN); keywords_insert("PLAN", SQL_PLAN); keywords_insert("DEBUG", SQL_DEBUG); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -4053,7 +4053,7 @@ sql_trans_drop_table(sql_trans *tr, sql_ list_append(tr->dropped, local_id); } - if (!isDeclaredTable(t)) + if (!isDeclaredTable(t) && !isTempSchema(s)) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list