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

Reply via email to