From eb6fc4fefb5e6b95467aa83d0b831d9921e9c9f9 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 2 Sep 2015 12:01:43 +0200 Subject: [PATCH 1/6] Use CDB_ColumnType and CDB_ColumnNames in bash tests --- test/extension/run_at_cartodb_schema.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/extension/run_at_cartodb_schema.sql b/test/extension/run_at_cartodb_schema.sql index c3792ff..0c09e5f 100644 --- a/test/extension/run_at_cartodb_schema.sql +++ b/test/extension/run_at_cartodb_schema.sql @@ -1,4 +1,6 @@ SET SCHEMA 'cartodb'; \i scripts-available/CDB_Quota.sql \i scripts-available/CDB_TableMetadata.sql +\i scripts-available/CDB_ColumnNames.sql +\i scripts-available/CDB_ColumnType.sql SET SCHEMA 'public'; \ No newline at end of file From 4b5c5dd275ed36b912adb275ed632eb62e747777 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 2 Sep 2015 12:04:52 +0200 Subject: [PATCH 2/6] CDB_ColumnNames uses schema and table name from regclass Fixes #122 --- scripts-available/CDB_ColumnNames.sql | 11 ++++++----- test/extension/test.sh | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/scripts-available/CDB_ColumnNames.sql b/scripts-available/CDB_ColumnNames.sql index 693ba3d..51e0244 100644 --- a/scripts-available/CDB_ColumnNames.sql +++ b/scripts-available/CDB_ColumnNames.sql @@ -3,11 +3,12 @@ CREATE OR REPLACE FUNCTION CDB_ColumnNames(REGCLASS) RETURNS SETOF information_schema.sql_identifier AS $$ - SELECT column_name - FROM information_schema.columns - WHERE - table_name IN (SELECT CDB_UserTables()) - AND table_name = '' || $1 || ''; + SELECT c.column_name + FROM information_schema.columns c, pg_class _tn, pg_namespace _sn + WHERE table_name = _tn.relname + AND table_schema = _sn.nspname + AND _tn.oid = $1::regclass::oid + AND _sn.oid = _tn.relnamespace; $$ LANGUAGE SQL; diff --git a/test/extension/test.sh b/test/extension/test.sh index ff9de57..f381232 100755 --- a/test/extension/test.sh +++ b/test/extension/test.sh @@ -337,6 +337,20 @@ function test_cdb_tablemetadatatouch_fails_from_user_without_permission() { sql postgres "REVOKE ALL ON CDB_TableMetadata FROM cdb_testmember_1;" } +function test_cdb_column_names() { + sql cdb_testmember_1 'CREATE TABLE cdb_testmember_1.table_cnames(c int, a int, r int, t int, o int);' + sql cdb_testmember_2 'CREATE TABLE cdb_testmember_2.table_cnames(d int, b int);' + + sql cdb_testmember_1 "SELECT string_agg(c,'') from (SELECT cartodb.CDB_ColumnNames('table_cnames') c) as s" should "carto" + sql cdb_testmember_2 "SELECT string_agg(c,'') from (SELECT cartodb.CDB_ColumnNames('table_cnames') c) as s" should "db" + + sql postgres "SELECT string_agg(c,'') from (SELECT cartodb.CDB_ColumnNames('cdb_testmember_1.table_cnames'::regclass) c) as s" should "carto" + sql postgres "SELECT string_agg(c,'') from (SELECT cartodb.CDB_ColumnNames('cdb_testmember_2.table_cnames') c) as s" should "db" + + sql cdb_testmember_1 'DROP TABLE cdb_testmember_1.table_cnames' + sql cdb_testmember_2 'DROP TABLE cdb_testmember_2.table_cnames' +} + #################################################### TESTS END HERE #################################################### run_tests $@ From 7582f2cbc59d01bd975a37bd220d5030327759a4 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 2 Sep 2015 12:06:04 +0200 Subject: [PATCH 3/6] CDB_ColumnType uses schema and table from regclass Fixes #130 --- scripts-available/CDB_ColumnType.sql | 13 +++++++------ test/extension/test.sh | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/scripts-available/CDB_ColumnType.sql b/scripts-available/CDB_ColumnType.sql index f887771..7793c0b 100644 --- a/scripts-available/CDB_ColumnType.sql +++ b/scripts-available/CDB_ColumnType.sql @@ -3,12 +3,13 @@ CREATE OR REPLACE FUNCTION CDB_ColumnType(REGCLASS, TEXT) RETURNS information_schema.character_data AS $$ - SELECT data_type - FROM information_schema.columns - WHERE - table_name IN (SELECT CDB_UserTables()) - AND table_name = '' || $1 || '' - AND column_name = '' || quote_ident($2) || ''; + SELECT c.data_type + FROM information_schema.columns c, pg_class _tn, pg_namespace _sn + WHERE table_name = _tn.relname + AND table_schema = _sn.nspname + AND column_name = $2 + AND _tn.oid = $1::regclass::oid + AND _sn.oid = _tn.relnamespace; $$ LANGUAGE SQL; diff --git a/test/extension/test.sh b/test/extension/test.sh index f381232..f9ed2ec 100755 --- a/test/extension/test.sh +++ b/test/extension/test.sh @@ -351,6 +351,20 @@ function test_cdb_column_names() { sql cdb_testmember_2 'DROP TABLE cdb_testmember_2.table_cnames' } +function test_cdb_column_type() { + sql cdb_testmember_1 'CREATE TABLE cdb_testmember_1.table_ctype(c int, a int, r int, t int, o int);' + sql cdb_testmember_2 'CREATE TABLE cdb_testmember_2.table_ctype(c text, a text, r text, t text, o text);' + + sql cdb_testmember_1 "SELECT cartodb.CDB_ColumnType('table_ctype', 'c')" should "integer" + sql cdb_testmember_2 "SELECT cartodb.CDB_ColumnType('table_ctype', 'c')" should "text" + + sql postgres "SELECT cartodb.CDB_ColumnType('cdb_testmember_1.table_ctype', 'c')" should "integer" + sql postgres "SELECT cartodb.CDB_ColumnType('cdb_testmember_2.table_ctype', 'c')" should "text" + + sql cdb_testmember_1 'DROP TABLE cdb_testmember_1.table_ctype' + sql cdb_testmember_2 'DROP TABLE cdb_testmember_2.table_ctype' +} + #################################################### TESTS END HERE #################################################### run_tests $@ From afecef0e31569f044e5f0df594a5f7c51b52032b Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 2 Sep 2015 12:25:44 +0200 Subject: [PATCH 4/6] Removing redundant ::regclass casting --- scripts-available/CDB_ColumnNames.sql | 2 +- scripts-available/CDB_ColumnType.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts-available/CDB_ColumnNames.sql b/scripts-available/CDB_ColumnNames.sql index 51e0244..ebaf0b7 100644 --- a/scripts-available/CDB_ColumnNames.sql +++ b/scripts-available/CDB_ColumnNames.sql @@ -7,7 +7,7 @@ AS $$ FROM information_schema.columns c, pg_class _tn, pg_namespace _sn WHERE table_name = _tn.relname AND table_schema = _sn.nspname - AND _tn.oid = $1::regclass::oid + AND _tn.oid = $1::oid AND _sn.oid = _tn.relnamespace; $$ LANGUAGE SQL; diff --git a/scripts-available/CDB_ColumnType.sql b/scripts-available/CDB_ColumnType.sql index 7793c0b..8ddc36b 100644 --- a/scripts-available/CDB_ColumnType.sql +++ b/scripts-available/CDB_ColumnType.sql @@ -8,7 +8,7 @@ AS $$ WHERE table_name = _tn.relname AND table_schema = _sn.nspname AND column_name = $2 - AND _tn.oid = $1::regclass::oid + AND _tn.oid = $1::oid AND _sn.oid = _tn.relnamespace; $$ LANGUAGE SQL; From 2867a6fbad59c3e339a30c4ac74c0c9ea3eb3918 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 2 Sep 2015 12:32:34 +0200 Subject: [PATCH 5/6] Assert user can use its schema to retrieve column names --- test/extension/test.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/extension/test.sh b/test/extension/test.sh index f9ed2ec..0a59630 100755 --- a/test/extension/test.sh +++ b/test/extension/test.sh @@ -347,6 +347,9 @@ function test_cdb_column_names() { sql postgres "SELECT string_agg(c,'') from (SELECT cartodb.CDB_ColumnNames('cdb_testmember_1.table_cnames'::regclass) c) as s" should "carto" sql postgres "SELECT string_agg(c,'') from (SELECT cartodb.CDB_ColumnNames('cdb_testmember_2.table_cnames') c) as s" should "db" + # Using schema from owner + sql cdb_testmember_1 "SELECT string_agg(c,'') from (SELECT cartodb.CDB_ColumnNames('cdb_testmember_1.table_cnames') c) as s" should "carto" + sql cdb_testmember_1 'DROP TABLE cdb_testmember_1.table_cnames' sql cdb_testmember_2 'DROP TABLE cdb_testmember_2.table_cnames' } From e28b6344aa272f0d7940f5054525098a7794231c Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 2 Sep 2015 12:32:43 +0200 Subject: [PATCH 6/6] Assert it's not possible to get column names from a table without permissions --- test/extension/test.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/extension/test.sh b/test/extension/test.sh index 0a59630..d86a687 100755 --- a/test/extension/test.sh +++ b/test/extension/test.sh @@ -350,6 +350,9 @@ function test_cdb_column_names() { # Using schema from owner sql cdb_testmember_1 "SELECT string_agg(c,'') from (SELECT cartodb.CDB_ColumnNames('cdb_testmember_1.table_cnames') c) as s" should "carto" + ## it's not possible to get column names from a table where you don't have permissions + sql cdb_testmember_2 "SELECT string_agg(c,'') from (SELECT cartodb.CDB_ColumnNames('cdb_testmember_1.table_cnames') c) as s" fails + sql cdb_testmember_1 'DROP TABLE cdb_testmember_1.table_cnames' sql cdb_testmember_2 'DROP TABLE cdb_testmember_2.table_cnames' }