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