diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index f48c0bc..42e55f8 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -189,6 +189,7 @@ char *namespace_search_path = NULL; /* Local functions */ static void recomputeNamespacePath(void); +static Oid ChooseCreationNamespace(List *oidlist); static void InitTempTableNamespace(void); static void RemoveTempRelations(Oid tempNamespaceId); static void RemoveTempRelationsCallback(int code, Datum arg); @@ -3166,7 +3167,7 @@ PushOverrideSearchPath(OverrideSearchPath *newpath) { OverrideStackEntry *entry; List *oidlist; - Oid firstNS; + Oid creationNS; MemoryContext oldcxt; /* @@ -3177,13 +3178,8 @@ PushOverrideSearchPath(OverrideSearchPath *newpath) oidlist = list_copy(newpath->schemas); - /* - * Remember the first member of the explicit list. - */ - if (oidlist == NIL) - firstNS = InvalidOid; - else - firstNS = linitial_oid(oidlist); + /* Choose default creation namespace. */ + creationNS = ChooseCreationNamespace(oidlist); /* * Add any implicitly-searched namespaces to the list. Note these go on @@ -3201,7 +3197,7 @@ PushOverrideSearchPath(OverrideSearchPath *newpath) */ entry = (OverrideStackEntry *) palloc(sizeof(OverrideStackEntry)); entry->searchPath = oidlist; - entry->creationNamespace = firstNS; + entry->creationNamespace = creationNS; entry->nestLevel = GetCurrentTransactionNestLevel(); overrideStack = lcons(entry, overrideStack); @@ -3423,7 +3419,7 @@ recomputeNamespacePath(void) List *newpath; ListCell *l; bool temp_missing; - Oid firstNS; + Oid creationNS; MemoryContext oldcxt; /* Do nothing if an override search spec is active. */ @@ -3508,15 +3504,8 @@ recomputeNamespacePath(void) } } - /* - * Remember the first member of the explicit list. (Note: this is - * nominally wrong if temp_missing, but we need it anyway to distinguish - * explicit from implicit mention of pg_catalog.) - */ - if (oidlist == NIL) - firstNS = InvalidOid; - else - firstNS = linitial_oid(oidlist); + /* Choose default creation namespace. */ + creationNS = ChooseCreationNamespace(oidlist); /* * Add any implicitly-searched namespaces to the list. Note these go on @@ -3541,7 +3530,7 @@ recomputeNamespacePath(void) /* Now safe to assign to state variables. */ list_free(baseSearchPath); baseSearchPath = newpath; - baseCreationNamespace = firstNS; + baseCreationNamespace = creationNS; baseTempCreationPending = temp_missing; /* Mark the path valid. */ @@ -3560,6 +3549,27 @@ recomputeNamespacePath(void) } /* + * Choose a suitable default creation namespace. Except in bootstrap mode, we + * refuse to choose pg_catalog as a default even if it's explicitly present in + * the search_path. The user must explicitly write e.g. CREATE TABLE + * pg_catalog.something to create objects there. + */ +static Oid +ChooseCreationNamespace(List *oidlist) +{ + ListCell *lc; + + foreach (lc, oidlist) + { + Oid oid = lfirst_oid(lc); + + if (oid != PG_CATALOG_NAMESPACE || IsBootstrapProcessingMode()) + return oid; + } + return InvalidOid; +} + +/* * InitTempTableNamespace * Initialize temp table namespace on first use in a particular backend */ diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 57adbf6..0b5431b 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -6,7 +6,7 @@ * src/backend/catalog/system_views.sql */ -CREATE VIEW pg_roles AS +CREATE VIEW pg_catalog.pg_roles AS SELECT rolname, rolsuper, @@ -24,7 +24,7 @@ CREATE VIEW pg_roles AS FROM pg_authid LEFT JOIN pg_db_role_setting s ON (pg_authid.oid = setrole AND setdatabase = 0); -CREATE VIEW pg_shadow AS +CREATE VIEW pg_catalog.pg_shadow AS SELECT rolname AS usename, pg_authid.oid AS usesysid, @@ -41,7 +41,7 @@ CREATE VIEW pg_shadow AS REVOKE ALL on pg_shadow FROM public; -CREATE VIEW pg_group AS +CREATE VIEW pg_catalog.pg_group AS SELECT rolname AS groname, oid AS grosysid, @@ -49,7 +49,7 @@ CREATE VIEW pg_group AS FROM pg_authid WHERE NOT rolcanlogin; -CREATE VIEW pg_user AS +CREATE VIEW pg_catalog.pg_user AS SELECT usename, usesysid, @@ -62,7 +62,7 @@ CREATE VIEW pg_user AS useconfig FROM pg_shadow; -CREATE VIEW pg_rules AS +CREATE VIEW pg_catalog.pg_rules AS SELECT N.nspname AS schemaname, C.relname AS tablename, @@ -72,7 +72,7 @@ CREATE VIEW pg_rules AS LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE R.rulename != '_RETURN'; -CREATE VIEW pg_views AS +CREATE VIEW pg_catalog.pg_views AS SELECT N.nspname AS schemaname, C.relname AS viewname, @@ -81,7 +81,7 @@ CREATE VIEW pg_views AS FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relkind = 'v'; -CREATE VIEW pg_tables AS +CREATE VIEW pg_catalog.pg_tables AS SELECT N.nspname AS schemaname, C.relname AS tablename, @@ -94,7 +94,7 @@ CREATE VIEW pg_tables AS LEFT JOIN pg_tablespace T ON (T.oid = C.reltablespace) WHERE C.relkind = 'r'; -CREATE VIEW pg_matviews AS +CREATE VIEW pg_catalog.pg_matviews AS SELECT N.nspname AS schemaname, C.relname AS matviewname, @@ -107,7 +107,7 @@ CREATE VIEW pg_matviews AS LEFT JOIN pg_tablespace T ON (T.oid = C.reltablespace) WHERE C.relkind = 'm'; -CREATE VIEW pg_indexes AS +CREATE VIEW pg_catalog.pg_indexes AS SELECT N.nspname AS schemaname, C.relname AS tablename, @@ -120,7 +120,7 @@ CREATE VIEW pg_indexes AS LEFT JOIN pg_tablespace T ON (T.oid = I.reltablespace) WHERE C.relkind IN ('r', 'm') AND I.relkind = 'i'; -CREATE VIEW pg_stats AS +CREATE VIEW pg_catalog.pg_stats AS SELECT nspname AS schemaname, relname AS tablename, @@ -185,36 +185,36 @@ CREATE VIEW pg_stats AS REVOKE ALL on pg_statistic FROM public; -CREATE VIEW pg_locks AS +CREATE VIEW pg_catalog.pg_locks AS SELECT * FROM pg_lock_status() AS L; -CREATE VIEW pg_cursors AS +CREATE VIEW pg_catalog.pg_cursors AS SELECT * FROM pg_cursor() AS C; -CREATE VIEW pg_available_extensions AS +CREATE VIEW pg_catalog.pg_available_extensions AS SELECT E.name, E.default_version, X.extversion AS installed_version, E.comment FROM pg_available_extensions() AS E LEFT JOIN pg_extension AS X ON E.name = X.extname; -CREATE VIEW pg_available_extension_versions AS +CREATE VIEW pg_catalog.pg_available_extension_versions AS SELECT E.name, E.version, (X.extname IS NOT NULL) AS installed, E.superuser, E.relocatable, E.schema, E.requires, E.comment FROM pg_available_extension_versions() AS E LEFT JOIN pg_extension AS X ON E.name = X.extname AND E.version = X.extversion; -CREATE VIEW pg_prepared_xacts AS +CREATE VIEW pg_catalog.pg_prepared_xacts AS SELECT P.transaction, P.gid, P.prepared, U.rolname AS owner, D.datname AS database FROM pg_prepared_xact() AS P LEFT JOIN pg_authid U ON P.ownerid = U.oid LEFT JOIN pg_database D ON P.dbid = D.oid; -CREATE VIEW pg_prepared_statements AS +CREATE VIEW pg_catalog.pg_prepared_statements AS SELECT * FROM pg_prepared_statement() AS P; -CREATE VIEW pg_seclabels AS +CREATE VIEW pg_catalog.pg_seclabels AS SELECT l.objoid, l.classoid, l.objsubid, CASE WHEN rel.relkind = 'r' THEN 'table'::text @@ -367,7 +367,7 @@ FROM pg_shseclabel l JOIN pg_authid rol ON l.classoid = rol.tableoid AND l.objoid = rol.oid; -CREATE VIEW pg_settings AS +CREATE VIEW pg_catalog.pg_settings AS SELECT * FROM pg_show_all_settings() AS A; CREATE RULE pg_settings_u AS @@ -381,15 +381,15 @@ CREATE RULE pg_settings_n AS GRANT SELECT, UPDATE ON pg_settings TO PUBLIC; -CREATE VIEW pg_timezone_abbrevs AS +CREATE VIEW pg_catalog.pg_timezone_abbrevs AS SELECT * FROM pg_timezone_abbrevs(); -CREATE VIEW pg_timezone_names AS +CREATE VIEW pg_catalog.pg_timezone_names AS SELECT * FROM pg_timezone_names(); -- Statistics views -CREATE VIEW pg_stat_all_tables AS +CREATE VIEW pg_catalog.pg_stat_all_tables AS SELECT C.oid AS relid, N.nspname AS schemaname, @@ -419,7 +419,7 @@ CREATE VIEW pg_stat_all_tables AS WHERE C.relkind IN ('r', 't', 'm') GROUP BY C.oid, N.nspname, C.relname; -CREATE VIEW pg_stat_xact_all_tables AS +CREATE VIEW pg_catalog.pg_stat_xact_all_tables AS SELECT C.oid AS relid, N.nspname AS schemaname, @@ -439,27 +439,27 @@ CREATE VIEW pg_stat_xact_all_tables AS WHERE C.relkind IN ('r', 't', 'm') GROUP BY C.oid, N.nspname, C.relname; -CREATE VIEW pg_stat_sys_tables AS +CREATE VIEW pg_catalog.pg_stat_sys_tables AS SELECT * FROM pg_stat_all_tables WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE VIEW pg_stat_xact_sys_tables AS +CREATE VIEW pg_catalog.pg_stat_xact_sys_tables AS SELECT * FROM pg_stat_xact_all_tables WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE VIEW pg_stat_user_tables AS +CREATE VIEW pg_catalog.pg_stat_user_tables AS SELECT * FROM pg_stat_all_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE VIEW pg_stat_xact_user_tables AS +CREATE VIEW pg_catalog.pg_stat_xact_user_tables AS SELECT * FROM pg_stat_xact_all_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE VIEW pg_statio_all_tables AS +CREATE VIEW pg_catalog.pg_statio_all_tables AS SELECT C.oid AS relid, N.nspname AS schemaname, @@ -484,17 +484,17 @@ CREATE VIEW pg_statio_all_tables AS WHERE C.relkind IN ('r', 't', 'm') GROUP BY C.oid, N.nspname, C.relname, T.oid, X.oid; -CREATE VIEW pg_statio_sys_tables AS +CREATE VIEW pg_catalog.pg_statio_sys_tables AS SELECT * FROM pg_statio_all_tables WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE VIEW pg_statio_user_tables AS +CREATE VIEW pg_catalog.pg_statio_user_tables AS SELECT * FROM pg_statio_all_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE VIEW pg_stat_all_indexes AS +CREATE VIEW pg_catalog.pg_stat_all_indexes AS SELECT C.oid AS relid, I.oid AS indexrelid, @@ -510,17 +510,17 @@ CREATE VIEW pg_stat_all_indexes AS LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relkind IN ('r', 't', 'm'); -CREATE VIEW pg_stat_sys_indexes AS +CREATE VIEW pg_catalog.pg_stat_sys_indexes AS SELECT * FROM pg_stat_all_indexes WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE VIEW pg_stat_user_indexes AS +CREATE VIEW pg_catalog.pg_stat_user_indexes AS SELECT * FROM pg_stat_all_indexes WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE VIEW pg_statio_all_indexes AS +CREATE VIEW pg_catalog.pg_statio_all_indexes AS SELECT C.oid AS relid, I.oid AS indexrelid, @@ -536,17 +536,17 @@ CREATE VIEW pg_statio_all_indexes AS LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relkind IN ('r', 't', 'm'); -CREATE VIEW pg_statio_sys_indexes AS +CREATE VIEW pg_catalog.pg_statio_sys_indexes AS SELECT * FROM pg_statio_all_indexes WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE VIEW pg_statio_user_indexes AS +CREATE VIEW pg_catalog.pg_statio_user_indexes AS SELECT * FROM pg_statio_all_indexes WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE VIEW pg_statio_all_sequences AS +CREATE VIEW pg_catalog.pg_statio_all_sequences AS SELECT C.oid AS relid, N.nspname AS schemaname, @@ -558,17 +558,17 @@ CREATE VIEW pg_statio_all_sequences AS LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relkind = 'S'; -CREATE VIEW pg_statio_sys_sequences AS +CREATE VIEW pg_catalog.pg_statio_sys_sequences AS SELECT * FROM pg_statio_all_sequences WHERE schemaname IN ('pg_catalog', 'information_schema') OR schemaname ~ '^pg_toast'; -CREATE VIEW pg_statio_user_sequences AS +CREATE VIEW pg_catalog.pg_statio_user_sequences AS SELECT * FROM pg_statio_all_sequences WHERE schemaname NOT IN ('pg_catalog', 'information_schema') AND schemaname !~ '^pg_toast'; -CREATE VIEW pg_stat_activity AS +CREATE VIEW pg_catalog.pg_stat_activity AS SELECT S.datid AS datid, D.datname AS datname, @@ -590,7 +590,7 @@ CREATE VIEW pg_stat_activity AS WHERE S.datid = D.oid AND S.usesysid = U.oid; -CREATE VIEW pg_stat_replication AS +CREATE VIEW pg_catalog.pg_stat_replication AS SELECT S.pid, S.usesysid, @@ -612,7 +612,7 @@ CREATE VIEW pg_stat_replication AS WHERE S.usesysid = U.oid AND S.pid = W.pid; -CREATE VIEW pg_stat_database AS +CREATE VIEW pg_catalog.pg_stat_database AS SELECT D.oid AS datid, D.datname AS datname, @@ -636,7 +636,7 @@ CREATE VIEW pg_stat_database AS pg_stat_get_db_stat_reset_time(D.oid) AS stats_reset FROM pg_database D; -CREATE VIEW pg_stat_database_conflicts AS +CREATE VIEW pg_catalog.pg_stat_database_conflicts AS SELECT D.oid AS datid, D.datname AS datname, @@ -647,7 +647,7 @@ CREATE VIEW pg_stat_database_conflicts AS pg_stat_get_db_conflict_startup_deadlock(D.oid) AS confl_deadlock FROM pg_database D; -CREATE VIEW pg_stat_user_functions AS +CREATE VIEW pg_catalog.pg_stat_user_functions AS SELECT P.oid AS funcid, N.nspname AS schemaname, @@ -659,7 +659,7 @@ CREATE VIEW pg_stat_user_functions AS WHERE P.prolang != 12 -- fast check to eliminate built-in functions AND pg_stat_get_function_calls(P.oid) IS NOT NULL; -CREATE VIEW pg_stat_xact_user_functions AS +CREATE VIEW pg_catalog.pg_stat_xact_user_functions AS SELECT P.oid AS funcid, N.nspname AS schemaname, @@ -671,7 +671,7 @@ CREATE VIEW pg_stat_xact_user_functions AS WHERE P.prolang != 12 -- fast check to eliminate built-in functions AND pg_stat_get_xact_function_calls(P.oid) IS NOT NULL; -CREATE VIEW pg_stat_bgwriter AS +CREATE VIEW pg_catalog.pg_stat_bgwriter AS SELECT pg_stat_get_bgwriter_timed_checkpoints() AS checkpoints_timed, pg_stat_get_bgwriter_requested_checkpoints() AS checkpoints_req, @@ -685,7 +685,7 @@ CREATE VIEW pg_stat_bgwriter AS pg_stat_get_buf_alloc() AS buffers_alloc, pg_stat_get_bgwriter_stat_reset_time() AS stats_reset; -CREATE VIEW pg_user_mappings AS +CREATE VIEW pg_catalog.pg_user_mappings AS SELECT U.oid AS umid, S.oid AS srvid, @@ -716,7 +716,7 @@ REVOKE ALL on pg_user_mapping FROM public; -- Tsearch debug function. Defined here because it'd be pretty unwieldy -- to put it into pg_proc.h -CREATE FUNCTION ts_debug(IN config regconfig, IN document text, +CREATE FUNCTION pg_catalog.ts_debug(IN config regconfig, IN document text, OUT alias text, OUT description text, OUT token text, @@ -759,7 +759,7 @@ LANGUAGE SQL STRICT STABLE; COMMENT ON FUNCTION ts_debug(regconfig,text) IS 'debug function for text search configuration'; -CREATE FUNCTION ts_debug(IN document text, +CREATE FUNCTION pg_catalog.ts_debug(IN document text, OUT alias text, OUT description text, OUT token text, @@ -785,13 +785,13 @@ COMMENT ON FUNCTION ts_debug(text) IS -- CREATE OR REPLACE FUNCTION - pg_start_backup(label text, fast boolean DEFAULT false) + pg_catalog.pg_start_backup(label text, fast boolean DEFAULT false) RETURNS text STRICT VOLATILE LANGUAGE internal AS 'pg_start_backup'; CREATE OR REPLACE FUNCTION - json_populate_record(base anyelement, from_json json, use_json_as_text boolean DEFAULT false) + pg_catalog.json_populate_record(base anyelement, from_json json, use_json_as_text boolean DEFAULT false) RETURNS anyelement LANGUAGE internal STABLE AS 'json_populate_record'; CREATE OR REPLACE FUNCTION - json_populate_recordset(base anyelement, from_json json, use_json_as_text boolean DEFAULT false) + pg_catalog.json_populate_recordset(base anyelement, from_json json, use_json_as_text boolean DEFAULT false) RETURNS SETOF anyelement LANGUAGE internal STABLE ROWS 100 AS 'json_populate_recordset'; diff --git a/src/backend/snowball/snowball.sql.in b/src/backend/snowball/snowball.sql.in index 2f68393..b6301ab 100644 --- a/src/backend/snowball/snowball.sql.in +++ b/src/backend/snowball/snowball.sql.in @@ -1,12 +1,12 @@ -- src/backend/snowball/snowball.sql.in$ -- text search configuration for _LANGNAME_ language -CREATE TEXT SEARCH DICTIONARY _DICTNAME_ +CREATE TEXT SEARCH DICTIONARY pg_catalog._DICTNAME_ (TEMPLATE = snowball, Language = _LANGNAME_ _STOPWORDS_); COMMENT ON TEXT SEARCH DICTIONARY _DICTNAME_ IS 'snowball stemmer for _LANGNAME_ language'; -CREATE TEXT SEARCH CONFIGURATION _CFGNAME_ +CREATE TEXT SEARCH CONFIGURATION pg_catalog._CFGNAME_ (PARSER = default); COMMENT ON TEXT SEARCH CONFIGURATION _CFGNAME_ IS 'configuration for _LANGNAME_ language'; diff --git a/src/backend/snowball/snowball_func.sql.in b/src/backend/snowball/snowball_func.sql.in index e7d4510..86e6044 100644 --- a/src/backend/snowball/snowball_func.sql.in +++ b/src/backend/snowball/snowball_func.sql.in @@ -1,17 +1,15 @@ -- src/backend/snowball/snowball_func.sql.in$ -SET search_path = pg_catalog; - -CREATE FUNCTION dsnowball_init(INTERNAL) +CREATE FUNCTION pg_catalog.dsnowball_init(INTERNAL) RETURNS INTERNAL AS '$libdir/dict_snowball', 'dsnowball_init' LANGUAGE C STRICT; -CREATE FUNCTION dsnowball_lexize(INTERNAL, INTERNAL, INTERNAL, INTERNAL) +CREATE FUNCTION pg_catalog.dsnowball_lexize(INTERNAL, INTERNAL, INTERNAL, INTERNAL) RETURNS INTERNAL AS '$libdir/dict_snowball', 'dsnowball_lexize' LANGUAGE C STRICT; -CREATE TEXT SEARCH TEMPLATE snowball +CREATE TEXT SEARCH TEMPLATE pg_catalog.snowball (INIT = dsnowball_init, LEXIZE = dsnowball_lexize); -COMMENT ON TEXT SEARCH TEMPLATE snowball IS 'snowball stemmer'; +COMMENT ON TEXT SEARCH TEMPLATE pg_catalog.snowball IS 'snowball stemmer'; diff --git a/src/backend/utils/mb/conversion_procs/Makefile b/src/backend/utils/mb/conversion_procs/Makefile index 8481721..ef87ee5 100644 --- a/src/backend/utils/mb/conversion_procs/Makefile +++ b/src/backend/utils/mb/conversion_procs/Makefile @@ -176,7 +176,7 @@ $(SQLSCRIPT): Makefile func=$$1; shift; \ obj=$$1; shift; \ echo "-- $$se --> $$de"; \ - echo "CREATE OR REPLACE FUNCTION $$func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '$$"libdir"/$$obj', '$$func' LANGUAGE C STRICT;"; \ + echo "CREATE OR REPLACE FUNCTION pg_catalog.$$func (INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) RETURNS VOID AS '$$"libdir"/$$obj', '$$func' LANGUAGE C STRICT;"; \ echo "COMMENT ON FUNCTION $$func(INTEGER, INTEGER, CSTRING, INTERNAL, INTEGER) IS 'internal conversion function for $$se to $$de';"; \ echo "DROP CONVERSION pg_catalog.$$name;"; \ echo "CREATE DEFAULT CONVERSION pg_catalog.$$name FOR '$$se' TO '$$de' FROM $$func;"; \