Use quote_ident to quote schema and table names when necessary
Fixes #133
This commit is contained in:
parent
350c76f847
commit
4be7d4a497
@ -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/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
|
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
|
LOOP
|
||||||
-- RAISE DEBUG 'tab: %', rec2.p;
|
-- RAISE DEBUG 'tab: %', rec2.p;
|
||||||
-- RAISE DEBUG 'sc: %', rec2.sc;
|
-- 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;
|
END LOOP;
|
||||||
|
|
||||||
-- RAISE DEBUG 'Tables: %', tables;
|
-- RAISE DEBUG 'Tables: %', tables;
|
||||||
|
@ -178,6 +178,7 @@ function setup() {
|
|||||||
sql "CREATE SCHEMA cartodb;"
|
sql "CREATE SCHEMA cartodb;"
|
||||||
sql "GRANT USAGE ON SCHEMA cartodb TO public;"
|
sql "GRANT USAGE ON SCHEMA cartodb TO public;"
|
||||||
sql "CREATE EXTENSION postgis;"
|
sql "CREATE EXTENSION postgis;"
|
||||||
|
sql "CREATE EXTENSION plpythonu;"
|
||||||
|
|
||||||
log_info "########################### BOOTSTRAP ###########################"
|
log_info "########################### BOOTSTRAP ###########################"
|
||||||
${CMD} -d ${DATABASE} -f scripts-available/CDB_Organizations.sql
|
${CMD} -d ${DATABASE} -f scripts-available/CDB_Organizations.sql
|
||||||
@ -342,6 +343,58 @@ function test_cdb_tablemetadatatouch_fails_from_user_without_permission() {
|
|||||||
sql postgres "REVOKE ALL ON CDB_TableMetadata FROM cdb_testmember_1;"
|
sql postgres "REVOKE ALL ON CDB_TableMetadata FROM cdb_testmember_1;"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 ####################################################
|
#################################################### TESTS END HERE ####################################################
|
||||||
|
|
||||||
run_tests $@
|
run_tests $@
|
||||||
|
Loading…
Reference in New Issue
Block a user