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

Reply via email to