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