Changeset: 22fcf0f73d51 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=22fcf0f73d51
Modified Files:
        sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
        sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/common/sql_hash.c
        sql/common/sql_list.c
        sql/include/sql_list.h
        sql/server/rel_exp.c
        sql/server/rel_optimizer.c
        sql/server/rel_psm.c
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/test/BugTracker-2009/Tests/POWER_vs_prod.SF-2596114.stable.out
        
sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
        
sql/test/BugTracker-2010/Tests/group-by_ordered_column.Bug-2564.stable.out
        sql/test/BugTracker-2012/Tests/create_function.Bug-3172.stable.err
        
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
        
sql/test/BugTracker-2012/Tests/table_function_with_column_subselects.Bug-3172.stable.err
        sql/test/BugTracker-2013/Tests/between.Bug-3259.stable.out
        sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
        sql/test/Dependencies/Tests/Dependencies.stable.out
        sql/test/leaks/Tests/check1.stable.out
        sql/test/leaks/Tests/check2.stable.out
        sql/test/leaks/Tests/check3.stable.out
        sql/test/leaks/Tests/check4.stable.out
        sql/test/leaks/Tests/check5.stable.out
Branch: Feb2013
Log Message:

lots of small code fixes to reduce the memory footprint of an update
query on a huge table.


diffs (truncated from 1522 to 300 lines):

diff --git a/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out 
b/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
--- a/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
+++ b/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
@@ -102,15 +102,15 @@ function user.s5_1{autoCommit=true}():vo
     X_14 := sql.delta(X_6,X_9,r1_9,X_12);
     X_15 := algebra.leftfetchjoin(X_3,X_14);
     X_16 := sql.bind(X_2,"sys","udf_fuse","b",0);
-    (X_18,r1_20) := sql.bind(X_2,"sys","udf_fuse","b",2);
+    (X_18,r1_18) := sql.bind(X_2,"sys","udf_fuse","b",2);
     X_20 := sql.bind(X_2,"sys","udf_fuse","b",1);
-    X_21 := sql.delta(X_16,X_18,r1_20,X_20);
+    X_21 := sql.delta(X_16,X_18,r1_18,X_20);
     X_22 := algebra.leftfetchjoin(X_3,X_21);
     X_23:bat[:oid,:sht]  := batudf.fuse(X_15,X_22);
-    X_25 := sql.resultSet(1,1,X_23);
-    sql.rsColumn(X_25,"sys.L","fuse_a","smallint",16,0,X_23);
+    X_24 := sql.resultSet(1,1,X_23);
+    sql.rsColumn(X_24,"sys.L","fuse_a","smallint",16,0,X_23);
     X_30 := io.stdout();
-    sql.exportResult(X_30,X_25);
+    sql.exportResult(X_30,X_24);
 end s5_1;
 #explain select fuse(c,d) from udf_fuse;
 % .explain # table_name
@@ -126,15 +126,15 @@ function user.s6_1{autoCommit=true}():vo
     X_14 := sql.delta(X_6,X_9,r1_9,X_12);
     X_15 := algebra.leftfetchjoin(X_3,X_14);
     X_16 := sql.bind(X_2,"sys","udf_fuse","d",0);
-    (X_18,r1_20) := sql.bind(X_2,"sys","udf_fuse","d",2);
+    (X_18,r1_18) := sql.bind(X_2,"sys","udf_fuse","d",2);
     X_20 := sql.bind(X_2,"sys","udf_fuse","d",1);
-    X_21 := sql.delta(X_16,X_18,r1_20,X_20);
+    X_21 := sql.delta(X_16,X_18,r1_18,X_20);
     X_22 := algebra.leftfetchjoin(X_3,X_21);
     X_23:bat[:oid,:int]  := batudf.fuse(X_15,X_22);
-    X_25 := sql.resultSet(1,1,X_23);
-    sql.rsColumn(X_25,"sys.L","fuse_c","int",32,0,X_23);
+    X_24 := sql.resultSet(1,1,X_23);
+    sql.rsColumn(X_24,"sys.L","fuse_c","int",32,0,X_23);
     X_30 := io.stdout();
-    sql.exportResult(X_30,X_25);
+    sql.exportResult(X_30,X_24);
 end s6_1;
 #explain select fuse(e,f) from udf_fuse;
 % .explain # table_name
@@ -150,15 +150,15 @@ function user.s7_1{autoCommit=true}():vo
     X_14 := sql.delta(X_6,X_9,r1_9,X_12);
     X_15 := algebra.leftfetchjoin(X_3,X_14);
     X_16 := sql.bind(X_2,"sys","udf_fuse","f",0);
-    (X_18,r1_20) := sql.bind(X_2,"sys","udf_fuse","f",2);
+    (X_18,r1_18) := sql.bind(X_2,"sys","udf_fuse","f",2);
     X_20 := sql.bind(X_2,"sys","udf_fuse","f",1);
-    X_21 := sql.delta(X_16,X_18,r1_20,X_20);
+    X_21 := sql.delta(X_16,X_18,r1_18,X_20);
     X_22 := algebra.leftfetchjoin(X_3,X_21);
     X_23:bat[:oid,:lng]  := batudf.fuse(X_15,X_22);
-    X_25 := sql.resultSet(1,1,X_23);
-    sql.rsColumn(X_25,"sys.L","fuse_e","bigint",64,0,X_23);
+    X_24 := sql.resultSet(1,1,X_23);
+    sql.rsColumn(X_24,"sys.L","fuse_e","bigint",64,0,X_23);
     X_30 := io.stdout();
-    sql.exportResult(X_30,X_25);
+    sql.exportResult(X_30,X_24);
 end s7_1;
 #select fuse(a,b) from udf_fuse;
 % sys.L # table_name
diff --git a/sql/backends/monet5/UDF/Tests/udf-reverse.stable.out 
b/sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
--- a/sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
+++ b/sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
@@ -91,10 +91,10 @@ function user.s3_1{autoCommit=true}():vo
     X_14 := sql.delta(X_6,X_9,r1_9,X_12);
     X_15 := algebra.leftfetchjoin(X_3,X_14);
     X_16:bat[:oid,:str]  := batudf.reverse(X_15);
-    X_18 := sql.resultSet(1,1,X_16);
-    sql.rsColumn(X_18,"sys.L","reverse_x","clob",0,0,X_16);
+    X_17 := sql.resultSet(1,1,X_16);
+    sql.rsColumn(X_17,"sys.L","reverse_x","clob",0,0,X_16);
     X_22 := io.stdout();
-    sql.exportResult(X_22,X_18);
+    sql.exportResult(X_22,X_17);
 end s3_1;
 #select reverse(x) from udf_reverse;
 % sys.L # table_name
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -66,7 +66,7 @@ list_find_column(sql_allocator *sa, list
        node *n;
 
        if (l && !l->ht && list_length(l) > HASH_MIN_SIZE) {
-               l->ht = hash_new(l->sa, list_length(l), (fkeyvalue)&stmt_key);
+               l->ht = hash_new(l->sa, MAX(list_length(l), l->expected_cnt), 
(fkeyvalue)&stmt_key);
 
                for (n = l->h; n; n = n->next) {
                        char *nme = column_name(sa, n->data);
@@ -881,7 +881,7 @@ check_table_types(mvc *sql, sql_table *c
                        stmt *r = check_types(sql, &c->type, dtcs, tpe);
                        if (!r) 
                                return NULL;
-                       r = stmt_alias(sql->sa, r, sa_strdup(sql->sa, 
tbl->base.name), sa_strdup(sql->sa, c->base.name));
+                       r = stmt_alias(sql->sa, r, tbl->base.name, 
c->base.name);
                        list_append(l, r);
                }
                return stmt_table(sql->sa, stmt_list(sql->sa, l), temp);
@@ -896,7 +896,7 @@ check_table_types(mvc *sql, sql_table *c
                        if (!r) 
                                return NULL;
                        tname = table_name(sql->sa, r);
-                       r = stmt_alias(sql->sa, r, tname, sa_strdup(sql->sa, 
c->base.name));
+                       r = stmt_alias(sql->sa, r, tname, c->base.name);
                        list_append(l, r);
                }
                return stmt_table(sql->sa, stmt_list(sql->sa, l), temp);
@@ -917,7 +917,7 @@ check_table_types(mvc *sql, sql_table *c
                c = ct->columns.set->h->data;
                r = check_types(sql, &c->type, tab, tpe);
                tname = table_name(sql->sa, r);
-               r = stmt_alias(sql->sa, r, tname, sa_strdup(sql->sa, 
c->base.name));
+               r = stmt_alias(sql->sa, r, tname, c->base.name);
                return stmt_table(sql->sa, r, temp);
        }
 }
@@ -1170,14 +1170,10 @@ stmt_rename(mvc *sql, sql_rel *rel, sql_
                name = exp->r;
        if (!name)
                name = column_name(sql->sa, s);
-       else
-               name = sa_strdup(sql->sa, name);
        if (!rname && exp->type == e_column && exp->l)
                rname = exp->l;
        if (!rname)
                rname = table_name(sql->sa, s);
-       else
-               rname = sa_strdup(sql->sa, rname);
        s = stmt_alias(sql->sa, s, rname, name);
        return s;
 }
@@ -1198,17 +1194,17 @@ rel2bin_sql_table(mvc *sql, sql_table *t
        /* TID column */
        if (t->columns.set->h) { 
                /* tid function  sql.tid(t) */
-               char *rnme = sa_strdup(sql->sa, t->base.name);
+               char *rnme = t->base.name;
 
                stmt *sc = dels?dels:stmt_tid(sql->sa, t);
-               sc = stmt_alias(sql->sa, sc, rnme, sa_strdup(sql->sa, TID));
+               sc = stmt_alias(sql->sa, sc, rnme, TID);
                list_append(l, sc);
        }
        if (t->idxs.set) {
                for (n = t->idxs.set->h; n; n = n->next) {
                        sql_idx *i = n->data;
                        stmt *sc = stmt_idx(sql, i, dels);
-                       char *rnme = sa_strdup(sql->sa, t->base.name);
+                       char *rnme = t->base.name;
 
                        /* index names are prefixed, to make them independent */
                        sc = stmt_alias(sql->sa, sc, rnme, 
sa_strconcat(sql->sa, "%", i->base.name));
@@ -1219,34 +1215,41 @@ rel2bin_sql_table(mvc *sql, sql_table *t
 }
 
 static stmt *
-rel2bin_basetable( mvc *sql, sql_rel *rel, list *refs)
+rel2bin_basetable( mvc *sql, sql_rel *rel)
 {
        sql_table *t = rel->l;
-       stmt *sub = rel2bin_sql_table(sql, t);
-
-       (void)refs;
+       list *l = sa_list(sql->sa);
+       stmt *dels = stmt_dels( sql, t);
+       node *en;
+
        assert(rel->exps);
        /* add aliases */
-       if (rel->exps) {
-               node *en;
-               list *l = sa_list(sql->sa);
-
-               for( en = rel->exps->h; en; en = en->next ) {
-                       sql_exp *exp = en->data;
-                       stmt *s = bin_find_column(sql->sa, sub, exp->l, exp->r);
-                       char *rname = exp->rname?exp->rname:exp->l;
-       
-                       if (!s) {
-                               assert(0);
-                               return NULL;
-                       }
-                       rname = rname?sa_strdup(sql->sa, rname):NULL;
-                       s = stmt_alias(sql->sa, s, rname, sa_strdup(sql->sa, 
exp->name));
-                       list_append(l, s);
+       for( en = rel->exps->h; en; en = en->next ) {
+               sql_exp *exp = en->data;
+               char *rname = exp->rname?exp->rname:exp->l;
+               char *oname = exp->r;
+               stmt *s = NULL;
+
+               if (oname[0] == '%' && strcmp(oname, TID) == 0) {
+                       /* tid function  sql.tid(t) */
+                       char *rnme = t->base.name;
+
+                       s = dels?dels:stmt_tid(sql->sa, t);
+                       s = stmt_alias(sql->sa, s, rnme, TID);
+               } else if (oname[0] == '%') { 
+                       sql_idx *i = find_sql_idx(t, oname+1);
+
+                       s = stmt_idx(sql, i, dels);
+               } else {
+                       sql_column *c = find_sql_column(t, oname);
+
+                       s = stmt_col(sql, c, dels);
                }
-               sub = stmt_list(sql->sa, l);
+               s->tname = rname;
+               s->cname = exp->name;
+               list_append(l, s);
        }
-       return sub;
+       return stmt_list(sql->sa, l);
 }
 
 static stmt *
@@ -1280,7 +1283,7 @@ rel2bin_table( mvc *sql, sql_rel *rel, l
                                return NULL;
                }
 
-               psub = exp_bin(sql, op, sub, psub, NULL, NULL, NULL, NULL); /* 
table function */
+               psub = exp_bin(sql, op, sub, NULL, NULL, NULL, NULL, NULL); /* 
table function */
                if (!t || !psub) { 
                        assert(0);
                        return NULL;    
@@ -1292,8 +1295,7 @@ rel2bin_table( mvc *sql, sql_rel *rel, l
                        char *nme = c->base.name;
                        char *rnme = exp_find_rel_name(op);
 
-                       rnme = (rnme)?sa_strdup(sql->sa, rnme):NULL;
-                       s = stmt_alias(sql->sa, s, rnme, sa_strdup(sql->sa, 
nme));
+                       s = stmt_alias(sql->sa, s, rnme, nme);
                        list_append(l, s);
                }
                if (sub && sub->nrcols) { /* add sub */
@@ -1329,8 +1331,7 @@ rel2bin_table( mvc *sql, sql_rel *rel, l
                        char *nme = exp_name(c);
                        char *rnme = op?exp_find_rel_name(op):NULL;
 
-                       rnme = (rnme)?sa_strdup(sql->sa, rnme):NULL;
-                       s = stmt_alias(sql->sa, s, rnme, sa_strdup(sql->sa, 
nme));
+                       s = stmt_alias(sql->sa, s, rnme, nme);
                        list_append(l, s);
                }
                sub = stmt_list(sql->sa, l);
@@ -1356,8 +1357,7 @@ rel2bin_table( mvc *sql, sql_rel *rel, l
                }
                if (sub && sub->nrcols >= 1 && s->nrcols == 0)
                        s = stmt_const(sql->sa, bin_first_column(sql->sa, sub), 
s);
-               rnme = (rnme)?sa_strdup(sql->sa, rnme):NULL;
-               s = stmt_alias(sql->sa, s, rnme, sa_strdup(sql->sa, exp->name));
+               s = stmt_alias(sql->sa, s, rnme, exp->name);
                list_append(l, s);
        }
        if (osub && osub->nrcols) 
@@ -2306,6 +2306,8 @@ rel2bin_project( mvc *sql, sql_rel *rel,
        }
 
        pl = sa_list(sql->sa);
+       if (sub)
+               pl->expected_cnt = list_length(sub->op4.lval);
        psub = stmt_list(sql->sa, pl);
        for( en = rel->exps->h; en; en = en->next ) {
                sql_exp *exp = en->data;
@@ -4452,7 +4454,7 @@ subrel_bin(mvc *sql, sql_rel *rel, list 
        }
        switch (rel->op) {
        case op_basetable:
-               s = rel2bin_basetable(sql, rel, refs);
+               s = rel2bin_basetable(sql, rel);
                sql->type = Q_TABLE;
                break;
        case op_table:
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1360,9 +1360,6 @@ stmt_alias(sql_allocator *sa, stmt *op1,
        stmt *s = stmt_create(sa, st_alias);
 
        s->op1 = op1;
-       if (tname)
-               s->op2 = stmt_atom_string(sa, tname);
-       s->op3 = stmt_atom_string(sa, alias);
        s->nrcols = op1->nrcols;
        s->key = op1->key;
        s->aggr = op1->aggr;
diff --git a/sql/common/sql_hash.c b/sql/common/sql_hash.c
--- a/sql/common/sql_hash.c
+++ b/sql/common/sql_hash.c
@@ -80,7 +80,6 @@ hash_del(sql_hash *h, int key, void *val
 unsigned int
 hash_key(char *k)
 {
-       unsigned char *s = (unsigned char*)k;
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to