Changeset: 98154b275995 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=98154b275995
Added Files:
sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.stable.err
Modified Files:
sql/server/rel_select.c
sql/test/BugTracker-2019/Tests/All
sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.stable.out
Branch: default
Log Message:
Merge with Nov2019
diffs (230 lines):
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -796,6 +796,27 @@ check_is_lateral(symbol *tableref)
}
}
+static sql_rel *
+rel_reduce_on_column_privileges(mvc *sql, sql_rel *rel, sql_table *t)
+{
+ list *exps = sa_list(sql->sa);
+
+ for (node *n = rel->exps->h, *m = t->columns.set->h; n && m; n =
n->next, m = m->next) {
+ sql_exp *e = n->data;
+ sql_column *c = m->data;
+
+ if (column_privs(sql, c, PRIV_SELECT)) {
+ append(exps, e);
+ }
+ }
+ if (!list_empty(exps)) {
+ rel->exps = exps;
+ return rel;
+ }
+ return NULL;
+}
+
+
sql_rel *
table_ref(sql_query *query, sql_rel *rel, symbol *tableref, int lateral)
{
@@ -809,6 +830,7 @@ table_ref(sql_query *query, sql_rel *rel
sql_rel *temp_table = NULL;
char *sname = qname_schema(name);
sql_schema *s = NULL;
+ int allowed = 1;
tname = qname_table(name);
@@ -834,7 +856,7 @@ table_ref(sql_query *query, sql_rel *rel
if (!t && !temp_table) {
return sql_error(sql, 02, SQLSTATE(42S02) "SELECT: no
such table '%s'", tname);
} else if (!temp_table && !table_privs(sql, t, PRIV_SELECT)) {
- return sql_error(sql, 02, SQLSTATE(42000) "SELECT:
access denied for %s to table '%s.%s'", stack_get_string(sql, "current_user"),
s->base.name, tname);
+ allowed = 0;
}
if (tableref->data.lval->h->next->data.sym) { /* AS */
tname =
tableref->data.lval->h->next->data.sym->data.lval->h->data.sval;
@@ -861,7 +883,9 @@ table_ref(sql_query *query, sql_rel *rel
set_basecol(e);
}
}
- return temp_table;
+ if (allowed)
+ return temp_table;
+ return sql_error(sql, 02, SQLSTATE(42000) "SELECT:
access denied for %s to table '%s.%s'", stack_get_string(sql, "current_user"),
s->base.name, tname);
} else if (isView(t)) {
/* instantiate base view */
node *n,*m;
@@ -874,7 +898,6 @@ table_ref(sql_query *query, sql_rel *rel
if (!rel)
return NULL;
-
/* Rename columns of the rel_parse relation */
if (sql->emode != m_deps) {
assert(is_project(rel->op));
@@ -889,12 +912,20 @@ table_ref(sql_query *query, sql_rel *rel
set_basecol(e);
}
}
- return rel;
+ if (!allowed)
+ rel = rel_reduce_on_column_privileges(sql, rel,
t);
+ if (allowed && rel)
+ return rel;
+ return sql_error(sql, 02, SQLSTATE(42000) "SELECT:
access denied for %s to table '%s.%s'", stack_get_string(sql, "current_user"),
s->base.name, tname);
}
if ((isMergeTable(t) || isReplicaTable(t)) &&
list_empty(t->members.set))
return sql_error(sql, 02, SQLSTATE(42000) "MERGE or
REPLICA TABLE should have at least one table associated");
-
res = rel_basetable(sql, t, tname);
+ if (!allowed) {
+ res = rel_reduce_on_column_privileges(sql, res, t);
+ if (!res)
+ return sql_error(sql, 02, SQLSTATE(42000)
"SELECT: access denied for %s to table '%s.%s'", stack_get_string(sql,
"current_user"), s->base.name, tname);
+ }
if (tableref->data.lval->h->next->data.sym &&
tableref->data.lval->h->next->data.sym->data.lval->h->next->data.lval) /* AS
with column aliases */
res = rel_table_optname(sql, res,
tableref->data.lval->h->next->data.sym);
return res;
diff --git a/sql/test/BugTracker-2019/Tests/All
b/sql/test/BugTracker-2019/Tests/All
--- a/sql/test/BugTracker-2019/Tests/All
+++ b/sql/test/BugTracker-2019/Tests/All
@@ -36,7 +36,7 @@ merge-table-limit.Bug-6756
double-free.Bug-6757
HAVE_LIBPY3?python-loader-string.Bug-6759
select-char.Bug-6761
-KNOWNFAIL?grant-select-column.Bug-6765
+grant-select-column.Bug-6765
next-get-value-bulk.Bug-6766
filter_json_null.Bug-6773
prod-decimals.Bug-6774
diff --git
a/sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.stable.err
b/sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.stable.err
@@ -0,0 +1,29 @@
+stderr of test 'grant-select-column.Bug-6765` in directory
'sql/test/BugTracker-2019` itself:
+
+
+# 22:34:40 >
+# 22:34:40 > "/usr/bin/python3" "grant-select-column.Bug-6765.py"
"grant-select-column.Bug-6765"
+# 22:34:40 >
+
+MAPI = (myuser) /var/tmp/mtest-26496/.s.monetdb.31053
+QUERY = SELECT "id", "name" FROM "myschema"."test"; --error, no permission on
column "name"
+ERROR = !SELECT: identifier 'id' unknown
+CODE = 42000
+# builtin opt gdk_dbpath =
/home/niels/scratch/rc-nov2019/Linux-x86_64/var/monetdb5/dbfarm/demo
+# builtin opt mapi_port = 50000
+# builtin opt mapi_open = false
+# builtin opt mapi_ipv6 = false
+# builtin opt mapi_autosense = false
+# builtin opt sql_optimizer = default_pipe
+# builtin opt sql_debug = 0
+# cmdline opt gdk_nr_threads = 0
+# cmdline opt mapi_open = true
+# cmdline opt mapi_port = 31053
+# cmdline opt mapi_usock = /var/tmp/mtest-26496/.s.monetdb.31053
+# cmdline opt gdk_dbpath =
/home/niels/scratch/rc-nov2019/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2019
+#client4:!ERROR:ParseException:SQLparser:42000!SELECT: identifier 'id' unknown
+
+# 22:34:40 >
+# 22:34:40 > "Done."
+# 22:34:40 >
+
diff --git
a/sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.stable.out
b/sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.stable.out
--- a/sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.stable.out
+++ b/sql/test/BugTracker-2019/Tests/grant-select-column.Bug-6765.stable.out
@@ -1,9 +1,9 @@
stdout of test 'grant-select-column.Bug-6765` in directory
'sql/test/BugTracker-2019` itself:
-# 19:45:13 >
-# 19:45:13 > "/usr/bin/python3" "grant-select-column.Bug-6765.py"
"grant-select-column.Bug-6765"
-# 19:45:13 >
+# 22:34:40 >
+# 22:34:40 > "/usr/bin/python3" "grant-select-column.Bug-6765.py"
"grant-select-column.Bug-6765"
+# 22:34:40 >
#CREATE schema "myschema";CREATE TABLE "myschema"."test" ("id" integer,
"name" varchar(20));INSERT INTO "myschema"."test" ("id", "name") VALUES
(1,'Tom'),(2,'Karen');CREATE USER myuser WITH UNENCRYPTED PASSWORD 'Test123'
NAME 'Hulk' SCHEMA "myschema";GRANT SELECT ON "myschema"."test" TO myuser;
#CREATE schema "myschema";CREATE TABLE "myschema"."test" ("id" integer,
"name" varchar(20));INSERT INTO "myschema"."test" ("id", "name") VALUES
(1,'Tom'),(2,'Karen');CREATE USER myuser WITH UNENCRYPTED PASSWORD 'Test123'
NAME 'Hulk' SCHEMA "myschema";GRANT SELECT ON "myschema"."test" TO myuser;
@@ -20,22 +20,69 @@ stdout of test 'grant-select-column.Bug-
[ 2, "Karen" ]
#REVOKE SELECT ON "myschema"."test" FROM myuser;GRANT SELECT ("name") ON
"myschema"."test" TO myuser;
#REVOKE SELECT ON "myschema"."test" FROM myuser;GRANT SELECT ("name") ON
"myschema"."test" TO myuser;
+#SELECT "name" FROM "myschema"."test"; --ok
+% myschema.test # table_name
+% name # name
+% varchar # type
+% 5 # length
+[ "Tom" ]
+[ "Karen" ]
#DROP USER myuser;DROP SCHEMA "myschema" CASCADE;
#DROP USER myuser;DROP SCHEMA "myschema" CASCADE;
-# MonetDB 5 server v11.36.0 (hg id: 1d18bd8860b4+)
+# MonetDB 5 server v11.35.0 (hg id: 0563f80544ab)
# This is an unreleased version
# Serving database 'mTests_sql_test_BugTracker-2019', using 8 threads
-# Compiled for x86_64-unknown-linux-gnu/64bit with 128bit integers
-# Found 15.384 GiB available main-memory.
+# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers
+# Found 15.384 GiB available main-memory of which we use 12.538 GiB
# Copyright (c) 1993 - July 2008 CWI.
# Copyright (c) August 2008 - 2019 MonetDB B.V., all rights reserved
# Visit https://www.monetdb.org/ for further information
-# Listening for connection requests on mapi:monetdb://xps13:33829/
-# Listening for UNIX domain connection requests on
mapi:monetdb:///var/tmp/mtest-3703/.s.monetdb.33829
+# Listening for connection requests on mapi:monetdb://xps13:31053/
+# Listening for UNIX domain connection requests on
mapi:monetdb:///var/tmp/mtest-26496/.s.monetdb.31053
# MonetDB/GIS module loaded
+# SQL catalog created, loading sql scripts once
+# loading sql script: 09_like.sql
+# loading sql script: 10_math.sql
+# loading sql script: 12_url.sql
+# loading sql script: 13_date.sql
+# loading sql script: 14_inet.sql
+# loading sql script: 15_querylog.sql
+# loading sql script: 16_tracelog.sql
+# loading sql script: 17_temporal.sql
+# loading sql script: 18_index.sql
+# loading sql script: 20_vacuum.sql
+# loading sql script: 21_dependency_views.sql
+# loading sql script: 22_clients.sql
+# loading sql script: 23_skyserver.sql
+# loading sql script: 25_debug.sql
+# loading sql script: 26_sysmon.sql
+# loading sql script: 27_rejects.sql
+# loading sql script: 39_analytics.sql
+# loading sql script: 39_analytics_hge.sql
+# loading sql script: 40_geom.sql
+# loading sql script: 40_json.sql
+# loading sql script: 40_json_hge.sql
+# loading sql script: 41_md5sum.sql
+# loading sql script: 45_uuid.sql
+# loading sql script: 46_profiler.sql
+# loading sql script: 51_sys_schema_extension.sql
+# loading sql script: 60_wlcr.sql
+# loading sql script: 61_wlcr.sql
+# loading sql script: 72_fits.sql
+# loading sql script: 74_netcdf.sql
+# loading sql script: 75_lidar.sql
+# loading sql script: 75_shp.sql
+# loading sql script: 75_storagemodel.sql
+# loading sql script: 80_statistics.sql
+# loading sql script: 80_udf.sql
+# loading sql script: 80_udf_hge.sql
+# loading sql script: 85_bam.sql
+# loading sql script: 90_generator.sql
+# loading sql script: 90_generator_hge.sql
+# loading sql script: 99_system.sql
# MonetDB/SQL module loaded
-# 19:45:13 >
-# 19:45:13 > "Done."
-# 19:45:13 >
+# 22:34:40 >
+# 22:34:40 > "Done."
+# 22:34:40 >
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list