diff --git a/scripts-available/CDB_QueryTables.sql b/scripts-available/CDB_QueryTables.sql index ac61281..c7cfa64 100644 --- a/scripts-available/CDB_QueryTables.sql +++ b/scripts-available/CDB_QueryTables.sql @@ -41,11 +41,11 @@ BEGIN xpath('//x:Relation-Name/text()', exp, ARRAY[ARRAY['x', 'http://www.postgresql.org/2009/explain']]) as x, xpath('//x:Relation-Name/../x:Schema/text()', exp, ARRAY[ARRAY['x', 'http://www.postgresql.org/2009/explain']]) as s ) - SELECT unnest(x) as p, unnest(s) as sc from inp + SELECT unnest(x)::text as p, unnest(s)::text as sc from inp LOOP -- RAISE DEBUG 'tab: %', rec2.p; -- RAISE DEBUG 'sc: %', rec2.sc; - tables := array_append(tables, (rec2.sc || '.' || rec2.p)); + tables := array_append(tables, format('%s.%s', quote_ident(rec2.sc), quote_ident(rec2.p))); END LOOP; -- RAISE DEBUG 'Tables: %', tables; diff --git a/test/extension/test.sh b/test/extension/test.sh index d86a687..4c1ecf8 100755 --- a/test/extension/test.sh +++ b/test/extension/test.sh @@ -178,6 +178,7 @@ function setup() { sql "CREATE SCHEMA cartodb;" sql "GRANT USAGE ON SCHEMA cartodb TO public;" sql "CREATE EXTENSION postgis;" + sql "CREATE EXTENSION plpythonu;" log_info "########################### BOOTSTRAP ###########################" ${CMD} -d ${DATABASE} -f scripts-available/CDB_Organizations.sql @@ -227,7 +228,12 @@ function run_tests() { local TESTS if [[ $# -ge 1 ]] then - TESTS="$@" + if [[ $# -eq 1 ]] + then + TESTS=`cat $0 | grep -o "$1[^\(]*"` + else + TESTS="$@" + fi else TESTS=`cat $0 | perl -n -e'/function (test.*)\(\)/ && print "$1\n"'` fi @@ -371,6 +377,58 @@ function test_cdb_column_type() { sql cdb_testmember_2 'DROP TABLE cdb_testmember_2.table_ctype' } +function test_cdb_querytables_schema_and_table_names_with_dots() { + ${CMD} -d ${DATABASE} -f scripts-available/CDB_QueryStatements.sql + ${CMD} -d ${DATABASE} -f scripts-available/CDB_QueryTables.sql + + sql postgres 'CREATE SCHEMA "foo.bar";' + sql postgres 'CREATE TABLE "foo.bar"."c.a.r.t.o.d.b" (a int);' + sql postgres 'INSERT INTO "foo.bar"."c.a.r.t.o.d.b" values (1);' + sql postgres 'SELECT a FROM "foo.bar"."c.a.r.t.o.d.b";' should 1 + + sql postgres 'SELECT CDB_QueryTablesText($q$select * from "foo.bar"."c.a.r.t.o.d.b"$q$);' should '{"\"foo.bar\".\"c.a.r.t.o.d.b\""}' + sql postgres 'SELECT CDB_QueryTables($q$select * from "foo.bar"."c.a.r.t.o.d.b"$q$);' should '{"\"foo.bar\".\"c.a.r.t.o.d.b\""}' + + sql postgres 'DROP TABLE "foo.bar"."c.a.r.t.o.d.b";' + sql postgres 'DROP SCHEMA "foo.bar";' +} + +function test_cdb_querytables_table_name_with_dots() { + ${CMD} -d ${DATABASE} -f scripts-available/CDB_QueryStatements.sql + ${CMD} -d ${DATABASE} -f scripts-available/CDB_QueryTables.sql + + sql postgres 'CREATE TABLE "w.a.d.u.s" (a int);'; + + sql postgres 'SELECT CDB_QueryTablesText($q$select * from "w.a.d.u.s"$q$);' should '{"public.\"w.a.d.u.s\""}' + sql postgres 'SELECT CDB_QueryTables($q$select * from "w.a.d.u.s"$q$);' should '{"public.\"w.a.d.u.s\""}' + + sql postgres 'DROP TABLE "w.a.d.u.s";'; +} + +function test_cdb_querytables_happy_cases() { + ${CMD} -d ${DATABASE} -f scripts-available/CDB_QueryStatements.sql + ${CMD} -d ${DATABASE} -f scripts-available/CDB_QueryTables.sql + + sql postgres 'CREATE TABLE wadus (a int);'; + sql postgres 'CREATE TABLE "FOOBAR" (a int);'; + sql postgres 'CREATE SCHEMA foo;' + sql postgres 'CREATE TABLE foo.wadus (a int);'; + + ## See how it does NOT quote anything here + sql postgres 'SELECT CDB_QueryTablesText($q$select * from wadus$q$);' should '{public.wadus}' + sql postgres 'SELECT CDB_QueryTablesText($q$select * from foo.wadus$q$);' should '{foo.wadus}' + sql postgres 'SELECT CDB_QueryTables($q$select * from wadus$q$);' should '{public.wadus}' + sql postgres 'SELECT CDB_QueryTables($q$select * from foo.wadus$q$);' should '{foo.wadus}' + + ## But it quotes when it's needed even if table name has no dots but was created with quotes + sql postgres 'SELECT CDB_QueryTablesText($q$select * from "FOOBAR"$q$);' should '{"public.\"FOOBAR\""}' + + sql postgres 'DROP TABLE wadus;' + sql postgres 'DROP TABLE "FOOBAR";' + sql postgres 'DROP TABLE foo.wadus;' + sql postgres 'DROP SCHEMA foo;' +} + #################################################### TESTS END HERE #################################################### run_tests $@