Changeset: 11422cdd2840 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=11422cdd2840
Modified Files:
        MonetDB5/src/modules/atoms/url.mx
        sql/src/backends/monet5/sql.mx
        sql/src/backends/monet5/sql_gencode.mx
        sql/src/backends/monet5/sql_result.mx
        sql/src/backends/monet5/sql_scenario.mx
        sql/src/server/rel_updates.c
        sql/src/server/sql_mvc.c
        sql/src/server/sql_mvc.h
        sql/src/server/sql_parser.y
        sql/src/server/sql_qc.c
        sql/src/server/sql_qc.h
        sql/src/server/sql_scan.c
        
sql/src/test/BugDay_2005-12-19_2.9.3/Tests/prepare_doesnot_like_LIKE.SF-1234205.sql
        sql/src/test/BugTracker-2010/Tests/limit_in_prepare.Bug-2552.sql
        sql/src/test/BugTracker/Tests/decimal_prepare.SF-1655818.sql
        sql/src/test/BugTracker/Tests/large_prepare.SF-1363729.sql
        sql/src/test/BugTracker/Tests/large_prepare_2.SF-1363729.sql
Branch: default
Log Message:

merged query cache and prepared statement store. This will allow using
Xclose statements to cleanup prepared statements.


diffs (truncated from 548 to 300 lines):

diff -r 760f20e36ab4 -r 11422cdd2840 MonetDB5/src/modules/atoms/url.mx
--- a/MonetDB5/src/modules/atoms/url.mx Sun Dec 12 21:46:00 2010 +0100
+++ b/MonetDB5/src/modules/atoms/url.mx Mon Dec 13 08:57:01 2010 +0100
@@ -65,6 +65,10 @@
 address URLnoop
 comment "Create an URL from a string literal";
 
+command calc.url(s:str) :url
+address URLnoop
+comment "Create an URL from a string literal";
+
 command calc.url(s:url) :url
 address URLnoop
 comment "Create an URL from a string literal";
diff -r 760f20e36ab4 -r 11422cdd2840 sql/src/backends/monet5/sql.mx
--- a/sql/src/backends/monet5/sql.mx    Sun Dec 12 21:46:00 2010 +0100
+++ b/sql/src/backends/monet5/sql.mx    Mon Dec 13 08:57:01 2010 +0100
@@ -270,7 +270,7 @@
 comment "export a single value onto the stream s";
 
 pattern importTable{unsafe}( s:bstream, sname:str, tname:str, 
-       sep:str, rsep:str, ssep:str, ns:str, nr:lng, offset:lng) :bat[:str,:bat]
+       sep:str, rsep:str, ssep:str, ns:str, nr:lng, offset:lng, locked:int) 
:bat[:str,:bat]
 address mvc_import_table_wrap
 comment "Import a table from bstream s with the 
        given tuple and seperators (sep/rsep)";
@@ -290,7 +290,8 @@
        ns:str,
        fname:str,
        nr:lng,
-       offset:lng
+       offset:lng,
+       locked:int
 ):bat[:str,:bat];
        cs := str.codeset();
        f  := str.iconv(fname, "UTF-8", cs);
@@ -300,7 +301,7 @@
        bs := bstream.create(s, 33554432);
        #bs := bstream.create(s, 67108864);
 
-       res := sql.importTable(bs, sname, tname, tsep, rsep, ssep, ns, nr, 
offset);
+       res := sql.importTable(bs, sname, tname, tsep, rsep, ssep, ns, nr, 
offset, locked);
        bstream.destroy(bs);
        return res;
 end copy_from;
@@ -313,10 +314,11 @@
        ssep:str,
        ns:str,
        nr:lng,
-       offset:lng
+       offset:lng,
+       locked:int
 ):bat[:str,:bat];
        in := io.stdin();
-       res := sql.importTable(in, sname, tname, tsep, rsep, ssep, ns, nr, 
offset);
+       res := sql.importTable(in, sname, tname, tsep, rsep, ssep, ns, nr, 
offset, locked);
        return res;
 end copyfrom;
 
@@ -3108,6 +3110,7 @@
        unsigned char **N = (unsigned char **) getArgReference(stk, pci, 7);
        lng *sz = (lng *) getArgReference(stk, pci, 8);
        lng *offset = (lng *) getArgReference(stk, pci, 9);
+       int *locked = (int *) getArgReference(stk, pci, 10);
 
        if (msg)
                return msg;
@@ -3122,7 +3125,7 @@
        }
        len = strlen((char*)(*N));
        GDKstrFromStr(ns=GDKmalloc(len+1), *N, len); len = 0;
-       b = mvc_import_table(cntxt, m, *s, *sname, *tname, (char*)tsep, 
(char*)rsep, (char*)ssep, (char*)ns, *sz, *offset);
+       b = mvc_import_table(cntxt, m, *s, *sname, *tname, (char*)tsep, 
(char*)rsep, (char*)ssep, (char*)ns, *sz, *offset, *locked);
        GDKfree(tsep);
        GDKfree(rsep);
        if(ssep)
@@ -4724,8 +4727,10 @@
        BUNins(t, "count", &count->batCacheid, FALSE);
 
        for(q = m->qc->q; q; q = q->next) {
-               BUNappend(query, q->codestring, FALSE);
-               BUNappend(count, &q->count, FALSE);
+               if (q->type != Q_PREPARE) {
+                       BUNappend(query, q->codestring, FALSE);
+                       BUNappend(count, &q->count, FALSE);
+               }
        }
 
        BBPunfix(query->batCacheid);
diff -r 760f20e36ab4 -r 11422cdd2840 sql/src/backends/monet5/sql_gencode.mx
--- a/sql/src/backends/monet5/sql_gencode.mx    Sun Dec 12 21:46:00 2010 +0100
+++ b/sql/src/backends/monet5/sql_gencode.mx    Mon Dec 13 08:57:01 2010 +0100
@@ -1377,7 +1377,8 @@
                        if (s->nrcols == 0) { /* simple calc */
                                q = newStmt1(mb, calcRef, convert);
                        } else if (s->nrcols > 0 && 
-                               (f->type->eclass == EC_DEC ||
+                               (t->type->localtype > TYPE_str ||
+                                f->type->eclass == EC_DEC ||
                                 t->type->eclass == EC_DEC ||
                                 t->type->eclass == EC_INTERVAL ||
                                 EC_TEMP(t->type->eclass) ||
diff -r 760f20e36ab4 -r 11422cdd2840 sql/src/backends/monet5/sql_result.mx
--- a/sql/src/backends/monet5/sql_result.mx     Sun Dec 12 21:46:00 2010 +0100
+++ b/sql/src/backends/monet5/sql_result.mx     Mon Dec 13 08:57:01 2010 +0100
@@ -40,7 +40,7 @@
 extern int mvc_export_prepare(mvc *c, stream *s, cq *q, str w);
 extern int mvc_export_chunk(mvc *m, stream *s, int res_id, BUN offset, BUN nr);
 
-extern BAT *mvc_import_table(Client cntxt, mvc *c, bstream *s, char *sname, 
char *tname, char *sep, char *rsep, char *ssep, char *ns, lng nr, lng offset);
+extern BAT *mvc_import_table(Client cntxt, mvc *c, bstream *s, char *sname, 
char *tname, char *sep, char *rsep, char *ssep, char *ns, lng nr, lng offset, 
int locked);
 extern int mvc_result_table(mvc *m, int nr_cols, int type, BAT *order);
 
 extern int mvc_result_column(mvc *m, char *tn, char *name, char *typename, int 
digits, int scale, BAT *b);
@@ -421,7 +421,7 @@
 
 
 BAT *
-mvc_import_table(Client cntxt, mvc *m, bstream *bs, char *sname, char *tname, 
char *sep, char *rsep, char *ssep, char *ns, lng sz, lng offset)
+mvc_import_table(Client cntxt, mvc *m, bstream *bs, char *sname, char *tname, 
char *sep, char *rsep, char *ssep, char *ns, lng sz, lng offset, int locked)
 {
        int i = 0;
        sql_schema *s = mvc_bind_schema(m, sname);
@@ -497,10 +497,18 @@
                        fmt[i].rawfile = NULL;
                        fmt[i].batfile = NULL;
                        fmt[i].size = ATOMsize(fmt[i].adt);
+                       
+                       if (locked) {
+                               BAT *b = store_funcs.bind_col(m->session->tr, 
col, RDONLY);
+                               fmt[i].c[0] = b;
+                               fmt[i].ci[0] = bat_iterator(fmt[i].c[0]);
+                       }
                }
-               if (TABLETcreate_bats(&as, (BUN) (sz < 0 ? 1000 : sz)) >= 0) {
-                       if (SQLload_file(cntxt, &as, bs, out, sep, rsep, 
ssep?ssep[0]:0, offset, sz) != BUN_NONE && !as.error)
+               if (locked || TABLETcreate_bats(&as, (BUN) (sz < 0 ? 1000 : 
sz)) >= 0) {
+                       if (SQLload_file(cntxt, &as, bs, out, sep, rsep, 
ssep?ssep[0]:0, offset, sz) != BUN_NONE && !as.error) {
+                               /* TODO in case of locked generate views which 
inserted only */
                                bats = TABLETcollect_bats(&as);
+                       }
                }
                if (as.error) 
                        sql_error(m, 500, "%s", as.error);
diff -r 760f20e36ab4 -r 11422cdd2840 sql/src/backends/monet5/sql_scenario.mx
--- a/sql/src/backends/monet5/sql_scenario.mx   Sun Dec 12 21:46:00 2010 +0100
+++ b/sql/src/backends/monet5/sql_scenario.mx   Mon Dec 13 08:57:01 2010 +0100
@@ -638,7 +638,6 @@
        be = sql;
        sql = backend_create(m, c);
        m->qc = NULL;
-       m->prepare_qc = NULL;
        m->caching = 0;
        m->user_id = m->role_id = USER_MONETDB;
 
@@ -1268,7 +1267,7 @@
        be->q = NULL;
        if (m->emode == m_execute) {
                assert(m->sym->data.lval->h->type == type_int);
-               be->q = qc_find(m->prepare_qc, 
m->sym->data.lval->h->data.i_val);
+               be->q = qc_find(m->qc, m->sym->data.lval->h->data.i_val);
                if (!be->q) {
                        err = -1;
                        sql_error(m, 2, "no prepared statement with the given 
id\n");
@@ -1311,12 +1310,13 @@
                                m->emode = m_normal; 
                } else {
                        /* generate a factory instantiation */
-                       be->q = qc_insert((m->emode == 
m_prepare)?m->prepare_qc:m->qc, 
+                       be->q = qc_insert(m->qc, 
                                          m->sa,      /* the allocator */
                                          m->sym,     /* the sql symbol tree */
                                          m->args,    /* the argument list */
                                          m->argc,
                                          m->scanner.key ^ 
m->session->schema->base.id,/* the statement hash key */
+                                         (m->emode == m_prepare)?Q_PREPARE:
                                          m->type,/* the type of the statement 
*/
                                          sql_escape_str(QUERY(m->scanner)));
 
diff -r 760f20e36ab4 -r 11422cdd2840 sql/src/server/rel_updates.c
--- a/sql/src/server/rel_updates.c      Sun Dec 12 21:46:00 2010 +0100
+++ b/sql/src/server/rel_updates.c      Mon Dec 13 08:57:01 2010 +0100
@@ -492,7 +492,7 @@
 }
 
 static sql_rel *
-rel_import(mvc *sql, sql_table *t, char *tsep, char *rsep, char *ssep, char 
*ns, char *filename, lng nr, lng offset)
+rel_import(mvc *sql, sql_table *t, char *tsep, char *rsep, char *ssep, char 
*ns, char *filename, lng nr, lng offset, int locked)
 {
        sql_rel *res;
        list *exps, *args;
@@ -515,8 +515,13 @@
 
        if (filename)
                append( args, exp_atom_str(sql->sa, filename, &tpe)); 
-       import = exp_op(sql->sa,  append( 
-               append( args, exp_atom_lng(sql->sa, nr)), exp_atom_lng(sql->sa, 
offset)), f); 
+       import = exp_op(sql->sa,  
+               append(
+                       append( 
+                               append( args, 
+                                       exp_atom_lng(sql->sa, nr)), 
+                                       exp_atom_lng(sql->sa, offset)), 
+                                       exp_atom_int(sql->sa, locked)), f); 
        
        exps = new_exp_list(sql->sa);
        for (n = t->columns.set->h; n; n = n->next) {
@@ -528,7 +533,7 @@
 }
 
 static sql_rel *
-copyfrom(mvc *sql, dlist *qname, dlist *files, dlist *seps, dlist *nr_offset, 
str null_string)
+copyfrom(mvc *sql, dlist *qname, dlist *files, dlist *seps, dlist *nr_offset, 
str null_string, int locked)
 {
        sql_rel *rel = NULL;
        char *sname = qname_schema(qname);
@@ -571,7 +576,7 @@
 
                for (; n; n = n->next) {
                        char *fname = n->data.sval;
-                       sql_rel *nrel = rel_import(sql, t, tsep, rsep, ssep, 
ns, fname, nr, offset);
+                       sql_rel *nrel = rel_import(sql, t, tsep, rsep, ssep, 
ns, fname, nr, offset, locked);
 
                        if (!rel)
                                rel = nrel;
@@ -581,12 +586,11 @@
                                return rel;
                }
        } else {
-               rel = rel_import(sql, t, tsep, rsep, ssep, ns, NULL, nr, 
offset);
+               rel = rel_import(sql, t, tsep, rsep, ssep, ns, NULL, nr, 
offset, locked);
        }
        if (!rel)
                return rel;
-       rel = rel_insert_cluster(sql, t, rel);
-       return rel; 
+       return rel_insert_cluster(sql, t, rel);
 }
 
 static sql_rel *
@@ -651,8 +655,7 @@
                append(exps, exp_column(sql->sa, t->base.name, c->base.name, 
&c->type, CARD_MULTI, c->null, 0));
        }
        res = rel_table_func(sql->sa, import, exps);
-       res = rel_insert_cluster(sql, t, res);
-       return res;
+       return rel_insert_cluster(sql, t, res);
 }
 
 static sql_rel *
@@ -710,7 +713,7 @@
        {
                dlist *l = s->data.lval;
 
-               ret = copyfrom(sql, l->h->data.lval, l->h->next->data.lval, 
l->h->next->next->data.lval, l->h->next->next->next->data.lval, 
l->h->next->next->next->next->data.sval);
+               ret = copyfrom(sql, l->h->data.lval, l->h->next->data.lval, 
l->h->next->next->data.lval, l->h->next->next->next->data.lval, 
l->h->next->next->next->next->data.sval, 
l->h->next->next->next->next->next->data.i_val);
                sql->type = Q_UPDATE;
        }
                break;
diff -r 760f20e36ab4 -r 11422cdd2840 sql/src/server/sql_mvc.c
--- a/sql/src/server/sql_mvc.c  Sun Dec 12 21:46:00 2010 +0100
+++ b/sql/src/server/sql_mvc.c  Mon Dec 13 08:57:01 2010 +0100
@@ -160,14 +160,14 @@
 
        store_lock();
        schema_changed = sql_trans_begin(m->session);
-       if (m->cache && (schema_changed || m->qc->id > 10000 || err)){
-               if (m->qc)
-                       qc_destroy(m->qc);
-               m->qc = qc_create(m->clientid);
-       }
-       if (m->prepare_qc && (schema_changed || err)) {
-               qc_destroy(m->prepare_qc);
-               m->prepare_qc = qc_create(m->clientid);
+       if (m->qc && (schema_changed || m->qc->nr > 20000 || err)){
+               if (schema_changed || err) {
+                       if (m->qc)
+                               qc_destroy(m->qc);
+                       m->qc = qc_create(m->clientid);
+               } else { /* clean all but the prepared statements */
+                       qc_clean(m->qc);
+               }
        }
        if (m->session->active) 
                m->type = Q_TRANS;
@@ -276,10 +276,8 @@
        assert(m->session->active);     /* only abort an active transaction */
 
        store_lock();
-       if (m->qc) {
-               qc_destroy(m->qc);
-               m->qc = qc_create(m->clientid);
-       }
+       if (m->qc) 
+               qc_clean(m->qc);
        if (name && name[0] != '\0') {
                while (tr && (!tr->name || strcmp(tr->name, name) != 0))
                        tr = tr->parent;
@@ -380,7 +378,6 @@
        m->errstr[ERRSIZE-1] = '\0';
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to