Update of /cvsroot/monetdb/sql/src/server
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv11323/src/server
Modified Files:
Tag: Aug2009
rel_exp.mx rel_optimizer.mx rel_select.mx sql_mvc.mx
Log Message:
bug fixing
prepare/execute statements now go to seperate query cache
check for ambiguous order by columns
U rel_select.mx
Index: rel_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_select.mx,v
retrieving revision 1.152.2.1
retrieving revision 1.152.2.2
diff -u -d -r1.152.2.1 -r1.152.2.2
--- rel_select.mx 3 Aug 2009 18:25:23 -0000 1.152.2.1
+++ rel_select.mx 7 Aug 2009 14:26:12 -0000 1.152.2.2
@@ -88,6 +88,7 @@
#include "rel_dump.h"
#include "rel_prop.h"
+#define ERR_AMBIGUOUS 050000
#define rel_groupby_gbe(r,e) rel_groupby(r, append(new_exp_list(), e))
sql_rel *
@@ -340,7 +341,7 @@
break;
if (!found && e->l && exps_bind_column2(rel->exps, e->l, e->r))
found = 1;
- if (!found && !e->l && exps_bind_column(rel->exps, e->r))
+ if (!found && !e->l && exps_bind_column(rel->exps, e->r, NULL))
found = 1;
break;
case op_insert:
@@ -1137,6 +1138,7 @@
static sql_rel *
rel_bind_column_(mvc *sql, sql_rel **p, sql_rel *rel, char *cname )
{
+ int ambiguous = 0;
sql_rel *l = NULL, *r = NULL;
switch(rel->op) {
case op_join:
@@ -1152,7 +1154,7 @@
*p = rel;
l = rel_bind_column_(sql, p, rel->l, cname);
if (l && r && !is_subquery(r)) {
- (void) sql_error(sql, 02, "SELECT: identifier
'%s' unknown or ambiguous", cname);
+ (void) sql_error(sql, ERR_AMBIGUOUS, "SELECT:
identifier '%s' ambiguous", cname);
return NULL;
}
}
@@ -1167,8 +1169,12 @@
case op_project:
case op_table:
case op_basetable:
- if (rel->exps && exps_bind_column(rel->exps, cname))
+ if (rel->exps && exps_bind_column(rel->exps, cname, &ambiguous))
return rel;
+ if (ambiguous) {
+ (void) sql_error(sql, ERR_AMBIGUOUS, "SELECT:
identifier '%s' ambiguous", cname);
+ return NULL;
+ }
*p = rel;
if (is_processed(rel))
return NULL;
@@ -1198,7 +1204,7 @@
if (is_project(rel->op) || rel->op == op_table) {
if (rel->exps) {
- sql_exp *e = exps_bind_column(rel->exps, cname);
+ sql_exp *e = exps_bind_column(rel->exps, cname, NULL);
if (e)
return e;
}
@@ -1218,7 +1224,7 @@
return NULL;
if ((is_project(rel->op) || is_base(rel->op)) && rel->exps) {
- sql_exp *e = exps_bind_column(rel->exps, cname);
+ sql_exp *e = exps_bind_column(rel->exps, cname, NULL);
if (e)
return exp_alias_or_copy(sql, e->rname, cname, rel, e,
1);
}
@@ -1482,10 +1488,10 @@
exp = rel_bind_column(sql, *rel, name, f);
if (exp) {
if (var || a)
- return sql_error(sql, 02, "SELECT: identifier
'%s' ambiguous", name);
+ return sql_error(sql, ERR_AMBIGUOUS, "SELECT:
identifier '%s' ambiguous", name);
} else if (a) {
if (var)
- return sql_error(sql, 02, "SELECT: identifier
'%s' ambiguous", name);
+ return sql_error(sql, ERR_AMBIGUOUS, "SELECT:
identifier '%s' ambiguous", name);
exp = exp_param(a->name, &a->type, 0);
}
if (!exp && var)
@@ -1969,7 +1975,7 @@
are correlations with the outer relation */
sql_rel *r = rel_subquery(sql, NULL, ro, ek);
- if (!r) {
+ if (!r && sql->session->status != -ERR_AMBIGUOUS) {
/* reset error */
sql->session->status = 0;
sql->errstr[0] = 0;
@@ -2078,7 +2084,7 @@
are correlations with the outer relation */
sql_rel *r = rel_subquery(sql, NULL, ro, ek);
- if (!r) { /* correlation, ie return new relation */
+ if (!r && sql->session->status != -ERR_AMBIGUOUS) { /*
correlation, ie return new relation */
sql_exp *e;
/* reset error */
@@ -2491,7 +2497,7 @@
int correlated = 0, vals_only = 1;
int l_is_value = 1;
- if (!l) {
+ if (!l && sql->session->status != -ERR_AMBIGUOUS) {
l_is_value = 0;
/* reset error */
left = rel;
@@ -2531,7 +2537,7 @@
sql_rel *rl;
r = rel_value_exp(sql, &z, sval, f, ek);
- if (!r) {
+ if (!r && sql->session->status !=
-ERR_AMBIGUOUS) {
/* reset error */
sql->session->status = 0;
sql->errstr[0] = 0;
@@ -2652,7 +2658,7 @@
ek.card = card_set;
r = rel_subquery(sql, NULL, lo, ek);
- if (!r && rel) { /* correlation */
+ if (!r && rel && sql->session->status != -ERR_AMBIGUOUS) { /*
correlation */
sql_exp *le, *re;
/* reset error */
sql->session->status = 0;
@@ -3810,7 +3816,7 @@
assert(order->data.lval->h->next->type == type_int);
if (or != rel)
return NULL;
- if (!e && col->token == SQL_COLUMN) {
+ if (!e && sql->session->status != -ERR_AMBIGUOUS &&
col->token == SQL_COLUMN) {
/* reset error */
sql->session->status = 0;
sql->errstr[0] = '\0';
@@ -3821,7 +3827,7 @@
e = NULL;
}
}
- if (!e) {
+ if (!e && sql->session->status != -ERR_AMBIGUOUS) {
/* reset error */
sql->session->status = 0;
sql->errstr[0] = '\0';
@@ -3979,7 +3985,7 @@
*is_last=1;
return e;
}
- if (!r) {
+ if (!r && sql->session->status != -ERR_AMBIGUOUS) {
if (!*rel)
return NULL;
@@ -4163,7 +4169,7 @@
for (n = exps->h; n; n = n->next) {
sql_exp *le = n->data;
char *nm = le->name;
- sql_exp *re = exps_bind_column(r_exps, nm);
+ sql_exp *re = exps_bind_column(r_exps, nm, NULL);
if (re) {
found = 1;
U rel_optimizer.mx
Index: rel_optimizer.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_optimizer.mx,v
retrieving revision 1.67
retrieving revision 1.67.2.1
diff -u -d -r1.67 -r1.67.2.1
--- rel_optimizer.mx 1 Aug 2009 14:47:41 -0000 1.67
+++ rel_optimizer.mx 7 Aug 2009 14:26:11 -0000 1.67.2.1
@@ -67,7 +67,7 @@
sql_table *t = rel->l;
if (rel->exps) {
- sql_exp *rename = exps_bind_column(rel->exps, name);
+ sql_exp *rename = exps_bind_column(rel->exps, name,
NULL);
if (!rename ||
rename->type != e_column ||
(rename->l && strcmp(t->base.name, rename->l) != 0))
@@ -83,7 +83,7 @@
}
case op_table:
if (rel->exps)
- alias = exps_bind_column(rel->exps, name);
+ alias = exps_bind_column(rel->exps, name, NULL);
/* table func */
return NULL;
case op_join:
@@ -107,7 +107,7 @@
case op_groupby:
if (!rel->exps)
break;
- alias = exps_bind_column(rel->exps, name);
+ alias = exps_bind_column(rel->exps, name, NULL);
break;
case op_insert:
case op_update:
@@ -883,7 +883,7 @@
ne = exps_bind_column2(f->exps, e->l, e->r);
/* if relation name matches expressions relation name,
find column based on column name alone */
} else {
- ne = exps_bind_column(f->exps, e->r);
+ ne = exps_bind_column(f->exps, e->r, NULL);
}
if (!ne)
return exp_dup(e);
@@ -993,7 +993,7 @@
/* if relation name matches expressions relation name,
find column based on column name alone */
}
if (!ne && !e->l)
- ne = exps_bind_column(f->exps, e->r);
+ ne = exps_bind_column(f->exps, e->r, NULL);
if (!ne)
return NULL;
e = NULL;
@@ -2010,7 +2010,7 @@
if (exp_is_atom(e))
continue;
if ((e->l && exps_bind_column2(r_exps, e->l,
e->r) != NULL) ||
- (exps_bind_column(r_exps, e->r) != NULL &&
(!e->l || !e->r)))
+ (exps_bind_column(r_exps, e->r, NULL) !=
NULL && (!e->l || !e->r)))
return rel;
}
for(n = r_exps->h; n; n = n->next) {
@@ -2019,7 +2019,7 @@
if (exp_is_atom(e))
continue;
if ((e->l && exps_bind_column2(l_exps, e->l,
e->r) != NULL) ||
- (exps_bind_column(l_exps, e->r) != NULL &&
(!e->l || !e->r)))
+ (exps_bind_column(l_exps, e->r, NULL) !=
NULL && (!e->l || !e->r)))
return rel;
}
list_destroy(l_exps);
@@ -2749,7 +2749,7 @@
if (e->l)
re = exps_bind_column2(r->exps, e->l, e->r);
if (!re && ((char*)e->r)[0] == 'L')
- re = exps_bind_column(r->exps, e->r);
+ re = exps_bind_column(r->exps, e->r, NULL);
if (re)
return is_identity(re, r->l);
}
U rel_exp.mx
Index: rel_exp.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_exp.mx,v
retrieving revision 1.33
retrieving revision 1.33.2.1
diff -u -d -r1.33 -r1.33.2.1
--- rel_exp.mx 25 Jul 2009 22:08:38 -0000 1.33
+++ rel_exp.mx 7 Aug 2009 14:26:11 -0000 1.33.2.1
@@ -81,7 +81,7 @@
extern int exp_is_correlation(sql_exp *e, sql_rel *r );
extern int exp_is_atom(sql_exp *e);
-extern sql_exp *exps_bind_column( list *exps, char *cname);
+extern sql_exp *exps_bind_column( list *exps, char *cname, int *ambiguous);
extern sql_exp *exps_bind_column2( list *exps, char *rname, char *cname);
extern int exps_card( list *l );
@@ -608,10 +608,10 @@
switch(e->type) {
case e_column:
- if (e->l) {
+ if (e->l) {
ne = exps_bind_column2(rel->exps, e->l, e->r);
} else {
- ne = exps_bind_column(rel->exps, e->r);
+ ne = exps_bind_column(rel->exps, e->r, NULL);
}
return ne;
case e_convert:
@@ -663,7 +663,7 @@
else if (rel->exps && e->l)
ne = exps_bind_column2(rel->exps, e->l, e->r);
else if (rel->exps)
- ne = exps_bind_column(rel->exps, e->r);
+ ne = exps_bind_column(rel->exps, e->r, NULL);
}
break;
case op_basetable:
@@ -727,18 +727,26 @@
}
sql_exp *
-exps_bind_column( list *exps, char *cname )
+exps_bind_column( list *exps, char *cname, int *ambiguous )
{
+ sql_exp *e = NULL;
+
if (exps && cname) {
node *en;
for (en = exps->h; en; en = en->next ) {
- sql_exp *e = en->data;
- if (e->name && strcmp(e->name, cname) == 0)
- return e;
+ sql_exp *ce = en->data;
+ if (ce->name && strcmp(ce->name, cname) == 0) {
+ if (e) {
+ if (ambiguous)
+ *ambiguous = 1;
+ return NULL;
+ }
+ e = ce;
+ }
}
}
- return NULL;
+ return e;
}
sql_exp *
U sql_mvc.mx
Index: sql_mvc.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_mvc.mx,v
retrieving revision 1.223.2.1
retrieving revision 1.223.2.2
diff -u -d -r1.223.2.1 -r1.223.2.2
--- sql_mvc.mx 6 Aug 2009 17:36:21 -0000 1.223.2.1
+++ sql_mvc.mx 7 Aug 2009 14:26:18 -0000 1.223.2.2
@@ -83,6 +83,7 @@
sql_allocator *ra; /* allocator used during the relational phases
*/
sql_allocator *ba; /* allocator used for binary statement tree */
struct qc *qc;
+ struct qc *prepare_qc;
int clientid; /* id of the owner */
struct scanner scanner;
@@ -377,6 +378,10 @@
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->session->active)
m->type = Q_TRANS;
store_unlock();
@@ -584,6 +589,7 @@
m->errstr[ERRSIZE-1] = '\0';
m->qc = qc_create(clientid);
+ m->prepare_qc = qc_create(clientid);
m->sa = sa_create();
m->params = NULL;
@@ -724,6 +730,9 @@
if (m->qc)
qc_destroy(m->qc);
m->qc = NULL;
+ if (m->prepare_qc)
+ qc_destroy(m->prepare_qc);
+ m->prepare_qc = NULL;
_DELETE(m->args);
m->args = NULL;
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins