Changeset: 19d0fdaf4c10 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=19d0fdaf4c10
Modified Files:
        clients/mapiclient/dump.c
        clients/odbc/driver/SQLColAttribute.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimizer.c
        sql/server/sql_privileges.c
Branch: default
Log Message:

Merge with Jan2014 branch.


diffs (truncated from 370 to 300 lines):

diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -1347,12 +1347,7 @@ dump_database(Mapi mid, stream *toConsol
        const char *table_grants =
                "SELECT s.name, t.name, "
                       "a.name, "
-                      "CASE WHEN p.privileges = 1 THEN 'SELECT' "
-                           "WHEN p.privileges = 2 THEN 'UPDATE' "
-                           "WHEN p.privileges = 4 THEN 'INSERT' "
-                           "WHEN p.privileges = 8 THEN 'DELETE' "
-                           "WHEN p.privileges = 16 THEN 'EXECUTE' "
-                           "WHEN p.privileges = 32 THEN 'GRANT' END, "
+                      "sum(p.privileges), "
                       "g.name, p.grantable "
                "FROM sys.schemas s, sys.tables t, "
                     "sys.auths a, sys.privileges p, "
@@ -1361,16 +1356,19 @@ dump_database(Mapi mid, stream *toConsol
                      "p.auth_id = a.id AND "
                      "t.schema_id = s.id AND "
                      "t.system = FALSE AND "
-                     "p.grantor = g.id";
+                     "p.grantor = g.id "
+               "GROUP BY s.name, t.name, a.name, g.name, p.grantable "
+               "ORDER BY s.name, t.name, a.name, g.name, p.grantable";
        const char *column_grants =
                "SELECT s.name, t.name, "
                       "c.name, a.name, "
-                      "CASE WHEN p.privileges = 1 THEN 'SELECT' "
-                           "WHEN p.privileges = 2 THEN 'UPDATE' "
-                           "WHEN p.privileges = 4 THEN 'INSERT' "
-                           "WHEN p.privileges = 8 THEN 'DELETE' "
-                           "WHEN p.privileges = 16 THEN 'EXECUTE' "
-                           "WHEN p.privileges = 32 THEN 'GRANT' END, "
+                      "CASE p.privileges "
+                           "WHEN 1 THEN 'SELECT' "
+                           "WHEN 2 THEN 'UPDATE' "
+                           "WHEN 4 THEN 'INSERT' "
+                           "WHEN 8 THEN 'DELETE' "
+                           "WHEN 16 THEN 'EXECUTE' "
+                           "WHEN 32 THEN 'GRANT' END, "
                       "g.name, p.grantable "
                "FROM sys.schemas s, sys.tables t, "
                     "sys.columns c, sys.auths a, "
@@ -1380,7 +1378,8 @@ dump_database(Mapi mid, stream *toConsol
                      "p.auth_id = a.id AND "
                      "t.schema_id = s.id AND "
                      "t.system = FALSE AND "
-                     "p.grantor = g.id";
+                     "p.grantor = g.id "
+               "ORDER BY s.name, t.name, c.name, a.name, g.name, p.grantable";
        const char *schemas =
                "SELECT s.name, a.name "
                "FROM sys.schemas s, "
@@ -1735,7 +1734,7 @@ dump_database(Mapi mid, stream *toConsol
                char *schema = mapi_fetch_field(hdl, 0);
                char *tname = mapi_fetch_field(hdl, 1);
                char *aname = mapi_fetch_field(hdl, 2);
-               char *priv = mapi_fetch_field(hdl, 3);
+               int priv = atoi(mapi_fetch_field(hdl, 3));
                char *grantable = mapi_fetch_field(hdl, 5);
 
                if (sname != NULL && strcmp(schema, sname) != 0)
@@ -1747,8 +1746,39 @@ dump_database(Mapi mid, stream *toConsol
                        mnstr_printf(toConsole, "SET SCHEMA \"%s\";\n",
                                     curschema);
                }
-               mnstr_printf(toConsole, "GRANT %s ON \"%s\" TO \"%s\"",
-                            priv, tname, aname);
+               mnstr_printf(toConsole, "GRANT");
+               if (priv == 15) {
+                       mnstr_printf(toConsole, " ALL PRIVILEGES");
+               } else {
+                       const char *sep = "";
+
+                       if (priv & 1) {
+                               mnstr_printf(toConsole, "%s SELECT", sep);
+                               sep = ",";
+                       }
+                       if (priv & 2) {
+                               mnstr_printf(toConsole, "%s UPDATE", sep);
+                               sep = ",";
+                       }
+                       if (priv & 4) {
+                               mnstr_printf(toConsole, "%s INSERT", sep);
+                               sep = ",";
+                       }
+                       if (priv & 8) {
+                               mnstr_printf(toConsole, "%s DELETE", sep);
+                               sep = ",";
+                       }
+                       if (priv & 16) {
+                               mnstr_printf(toConsole, "%s EXECUTE", sep);
+                               sep = ",";
+                       }
+                       if (priv & 32) {
+                               mnstr_printf(toConsole, "%s GRANT", sep);
+                               sep = ",";
+                       }
+               }
+               mnstr_printf(toConsole, " ON TABLE \"%s\" TO \"%s\"",
+                            tname, aname);
                if (strcmp(grantable, "1") == 0)
                        mnstr_printf(toConsole, " WITH GRANT OPTION");
                mnstr_printf(toConsole, ";\n");
diff --git a/clients/odbc/driver/SQLColAttribute.c 
b/clients/odbc/driver/SQLColAttribute.c
--- a/clients/odbc/driver/SQLColAttribute.c
+++ b/clients/odbc/driver/SQLColAttribute.c
@@ -88,7 +88,7 @@ SQLColAttribute_(ODBCStmt *stmt,
        switch (FieldIdentifier) {
        case SQL_DESC_AUTO_UNIQUE_VALUE:        /* SQL_COLUMN_AUTO_INCREMENT */
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = 
rec->sql_desc_auto_unique_value;
+                       *(SQLLEN *) NumericAttributePtr = 
rec->sql_desc_auto_unique_value;
                break;
        case SQL_DESC_BASE_COLUMN_NAME:
                copyString(rec->sql_desc_base_column_name,
@@ -106,7 +106,7 @@ SQLColAttribute_(ODBCStmt *stmt,
                break;
        case SQL_DESC_CASE_SENSITIVE:   /* SQL_COLUMN_CASE_SENSITIVE */
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = 
rec->sql_desc_case_sensitive;
+                       *(SQLLEN *) NumericAttributePtr = 
rec->sql_desc_case_sensitive;
                break;
        case SQL_DESC_CATALOG_NAME:     /* SQL_COLUMN_QUALIFIER_NAME */
                copyString(rec->sql_desc_catalog_name,
@@ -117,7 +117,7 @@ SQLColAttribute_(ODBCStmt *stmt,
                break;
        case SQL_DESC_CONCISE_TYPE:     /* SQL_COLUMN_TYPE */
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = 
rec->sql_desc_concise_type;
+                       *(SQLLEN *) NumericAttributePtr = 
rec->sql_desc_concise_type;
                break;
        case SQL_DESC_COUNT:
                if (NumericAttributePtr)
@@ -129,7 +129,7 @@ SQLColAttribute_(ODBCStmt *stmt,
                break;
        case SQL_DESC_FIXED_PREC_SCALE: /* SQL_COLUMN_MONEY */
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = 
rec->sql_desc_fixed_prec_scale;
+                       *(SQLLEN *) NumericAttributePtr = 
rec->sql_desc_fixed_prec_scale;
                break;
        case SQL_DESC_LABEL:    /* SQL_COLUMN_LABEL */
                copyString(rec->sql_desc_label,
@@ -169,11 +169,11 @@ SQLColAttribute_(ODBCStmt *stmt,
                break;
        case SQL_DESC_NULLABLE:
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = rec->sql_desc_nullable;
+                       *(SQLLEN *) NumericAttributePtr = 
rec->sql_desc_nullable;
                break;
        case SQL_DESC_NUM_PREC_RADIX:
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = 
rec->sql_desc_num_prec_radix;
+                       *(SQLLEN *) NumericAttributePtr = 
rec->sql_desc_num_prec_radix;
                break;
        case SQL_DESC_OCTET_LENGTH:
                if (NumericAttributePtr)
@@ -182,12 +182,12 @@ SQLColAttribute_(ODBCStmt *stmt,
        case SQL_COLUMN_PRECISION:
        case SQL_DESC_PRECISION:
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = rec->sql_desc_precision;
+                       *(SQLLEN *) NumericAttributePtr = 
rec->sql_desc_precision;
                break;
        case SQL_COLUMN_SCALE:
        case SQL_DESC_SCALE:
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = rec->sql_desc_scale;
+                       *(SQLLEN *) NumericAttributePtr = rec->sql_desc_scale;
                break;
        case SQL_DESC_SCHEMA_NAME:      /* SQL_COLUMN_OWNER_NAME */
                copyString(rec->sql_desc_schema_name,
@@ -198,7 +198,7 @@ SQLColAttribute_(ODBCStmt *stmt,
                break;
        case SQL_DESC_SEARCHABLE:       /* SQL_COLUMN_SEARCHABLE */
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = rec->sql_desc_searchable;
+                       *(SQLLEN *) NumericAttributePtr = 
rec->sql_desc_searchable;
                break;
        case SQL_DESC_TABLE_NAME:       /* SQL_COLUMN_TABLE_NAME */
                copyString(rec->sql_desc_table_name,
@@ -209,7 +209,7 @@ SQLColAttribute_(ODBCStmt *stmt,
                break;
        case SQL_DESC_TYPE:
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = rec->sql_desc_type;
+                       *(SQLLEN *) NumericAttributePtr = rec->sql_desc_type;
                break;
        case SQL_DESC_TYPE_NAME:        /* SQL_COLUMN_TYPE_NAME */
                copyString(rec->sql_desc_type_name,
@@ -220,15 +220,15 @@ SQLColAttribute_(ODBCStmt *stmt,
                break;
        case SQL_DESC_UNNAMED:
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = rec->sql_desc_unnamed;
+                       *(SQLLEN *) NumericAttributePtr = rec->sql_desc_unnamed;
                break;
        case SQL_DESC_UNSIGNED: /* SQL_COLUMN_UNSIGNED */
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = rec->sql_desc_unsigned;
+                       *(SQLLEN *) NumericAttributePtr = 
rec->sql_desc_unsigned;
                break;
        case SQL_DESC_UPDATABLE:        /* SQL_COLUMN_UPDATABLE */
                if (NumericAttributePtr)
-                       *(int *) NumericAttributePtr = rec->sql_desc_updatable;
+                       *(SQLLEN *) NumericAttributePtr = 
rec->sql_desc_updatable;
                break;
        default:
                /* Invalid descriptor field identifier */
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -630,11 +630,23 @@ exp_match( sql_exp *e1, sql_exp *e2)
        if (exp_cmp(e1, e2) == 0)
                return 1;
        if (e1->type == e2->type && e1->type == e_column) {
-               if (!e1->name || !e2->name || strcmp(e1->name, e2->name) != 0)
+               if (!e1->l || !e2->l || strcmp(e1->l, e2->l) != 0) 
                        return 0;
-               if (!e1->l || !e2->l || strcmp(e1->l, e2->l) != 0)
+               if (!e1->r || !e2->r || strcmp(e1->r, e2->r) != 0)
                        return 0;
-               /* e1->r */
+               return 1;
+       }
+       return 0;
+}
+
+int 
+exp_refers( sql_exp *c, sql_exp *p)
+{
+       if (c->type == e_column) {
+               if (!p->name || !c->r || strcmp(p->name, c->r) != 0)
+                       return 0;
+               if (!c->l || (p->rname && strcmp(p->rname, c->l) != 0) || 
(!p->rname && strcmp(p->l, c->l) != 0))
+                       return 0;
                return 1;
        }
        return 0;
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -101,6 +101,7 @@ extern char *exp_find_rel_name(sql_exp *
 extern sql_exp *rel_find_exp( sql_rel *rel, sql_exp *e);
 
 extern int exp_cmp( sql_exp *e1, sql_exp *e2);
+extern int exp_refers( sql_exp *c, sql_exp *p);
 extern int exp_match( sql_exp *e1, sql_exp *e2);
 extern int exp_match_exp( sql_exp *e1, sql_exp *e2);
 /* match just the column (cmp equality) expressions */
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -3910,7 +3910,7 @@ rel_reduce_groupby_exps(int *changes, mv
                                                for (l = 0, n = gbe->h; l < k 
&& n && !fnd; l++, n = n->next) {
                                                        sql_exp *gb = n->data;
 
-                                                       if (scores[l] == -1 && 
exp_match_exp(e,gb)) {
+                                                       if (scores[l] == -1 && 
exp_refers(e,gb)) {
                                                                sql_column *c = 
exp_find_column_(rel, e, -2, &bt);
                                                                sql_exp *rs;
                                                               
@@ -3926,6 +3926,7 @@ rel_reduce_groupby_exps(int *changes, mv
                                                        append(nexps, e);
                                        }
                                        /* new reduced aggr expression list */
+                                       assert(list_length(nexps)>0);
                                        rel->exps = nexps;
                                        rel = rel_crossproduct(sql->sa, rel, r, 
op_join);
                                        rel->exps = lpje;
@@ -5533,11 +5534,6 @@ is_identity_of(sql_exp *e, sql_rel *l)
 }
 
 
-/* More general case is (join reduction)
-       {semi,anti}join (A, join(A,B) [A.c1 == B.c1]) [ A.c1 == B.c1 ]
-       into {semi,anti}join (A,B) [ A.c1 == B.c1 ] 
-*/
-       
 static sql_rel *
 rel_rewrite_semijoin(int *changes, mvc *sql, sql_rel *rel)
 {
@@ -5584,6 +5580,12 @@ rel_rewrite_semijoin(int *changes, mvc *
                                rl = r->l;
                }
 
+               /* More general case is (join reduction)
+                  {semi,anti}join (A, join(A,B) [A.c1 == B.c1]) [ A.c1 == B.c1 
]
+                  into {semi,anti}join (A,B) [ A.c1 == B.c1 ] 
+
+                  for semijoin also A.c1 == B.k1 ] [ A.c1 == B.k2 ] could be 
rewriten
+                */
                if (l && r && rl && 
                    is_basetable(l->op) && is_basetable(rl->op) &&
                    is_join(r->op) && l->l == rl->l)
@@ -5603,29 +5605,46 @@ rel_rewrite_semijoin(int *changes, mvc *
                                sql_exp *le = NULL, *oe = n->data;
                                sql_exp *re = NULL, *ne = m->data;
                                sql_column *cl;  
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to