diff options
| author | Shigeru Hanada | 2010-11-23 05:25:25 +0000 |
|---|---|---|
| committer | Shigeru Hanada | 2010-11-23 05:25:25 +0000 |
| commit | 59f1ce7272e88f478229135efe187589f062f023 (patch) | |
| tree | 22cf21ea28512c1ba1ccea793317ac9164355650 | |
| parent | e3b870878616f5e816166165494abc3857d32ac5 (diff) | |
| parent | 44475e782f4674d257b9e5c1a3930218a4b4deea (diff) | |
Merge branch 'master' into fdw_select_simplefdw_select_simple
| -rw-r--r-- | src/backend/catalog/dependency.c | 15 | ||||
| -rw-r--r-- | src/backend/catalog/namespace.c | 34 | ||||
| -rw-r--r-- | src/backend/commands/functioncmds.c | 20 | ||||
| -rw-r--r-- | src/backend/commands/tablecmds.c | 20 | ||||
| -rw-r--r-- | src/backend/commands/typecmds.c | 20 | ||||
| -rw-r--r-- | src/backend/utils/misc/guc-file.l | 11 | ||||
| -rw-r--r-- | src/include/catalog/dependency.h | 1 | ||||
| -rw-r--r-- | src/include/catalog/namespace.h | 2 | ||||
| -rw-r--r-- | src/test/regress/expected/text.out | 23 | ||||
| -rw-r--r-- | src/test/regress/sql/text.sql | 8 |
10 files changed, 91 insertions, 63 deletions
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index d448c6f614..461cb79c0d 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -2691,6 +2691,21 @@ getObjectDescription(const ObjectAddress *object) } /* + * getObjectDescriptionOids: as above, except the object is specified by Oids + */ +char * +getObjectDescriptionOids(Oid classid, Oid objid) +{ + ObjectAddress address; + + address.classId = classid; + address.objectId = objid; + address.objectSubId = 0; + + return getObjectDescription(&address); +} + +/* * subroutine for getObjectDescription: describe a relation */ static void diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index 3727146ea0..653c9ada11 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -2340,6 +2340,40 @@ LookupCreationNamespace(const char *nspname) } /* + * Common checks on switching namespaces. + * + * We complain if (1) the old and new namespaces are the same, (2) either the + * old or new namespaces is a temporary schema (or temporary toast schema), or + * (3) either the old or new namespaces is the TOAST schema. + */ +void +CheckSetNamespace(Oid oldNspOid, Oid nspOid, Oid classid, Oid objid) +{ + if (oldNspOid == nspOid) + ereport(ERROR, + (classid == RelationRelationId ? + errcode(ERRCODE_DUPLICATE_TABLE) : + classid == ProcedureRelationId ? + errcode(ERRCODE_DUPLICATE_FUNCTION) : + errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("%s is already in schema \"%s\"", + getObjectDescriptionOids(classid, objid), + get_namespace_name(nspOid)))); + + /* disallow renaming into or out of temp schemas */ + if (isAnyTempNamespace(nspOid) || isAnyTempNamespace(oldNspOid)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot move objects into or out of temporary schemas"))); + + /* same for TOAST schema */ + if (nspOid == PG_TOAST_NAMESPACE || oldNspOid == PG_TOAST_NAMESPACE) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot move objects into or out of TOAST schema"))); +} + +/* * QualifiedNameGetCreationNamespace * Given a possibly-qualified name for an object (in List-of-Values * format), determine what namespace the object should be created in. diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 4b6801ac54..62a2110251 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -1899,24 +1899,8 @@ AlterFunctionNamespace(List *name, List *argtypes, bool isagg, /* get schema OID and check its permissions */ nspOid = LookupCreationNamespace(newschema); - if (oldNspOid == nspOid) - ereport(ERROR, - (errcode(ERRCODE_DUPLICATE_FUNCTION), - errmsg("function \"%s\" is already in schema \"%s\"", - NameListToString(name), - newschema))); - - /* disallow renaming into or out of temp schemas */ - if (isAnyTempNamespace(nspOid) || isAnyTempNamespace(oldNspOid)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot move objects into or out of temporary schemas"))); - - /* same for TOAST schema */ - if (nspOid == PG_TOAST_NAMESPACE || oldNspOid == PG_TOAST_NAMESPACE) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot move objects into or out of TOAST schema"))); + /* common checks on switching namespaces */ + CheckSetNamespace(oldNspOid, nspOid, ProcedureRelationId, procOid); /* check for duplicate name (more friendly than unique-index failure) */ if (SearchSysCacheExists3(PROCNAMEARGSNSP, diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 4c1477bb5f..0880e2328b 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -8179,24 +8179,8 @@ AlterTableNamespace(RangeVar *relation, const char *newschema, /* get schema OID and check its permissions */ nspOid = LookupCreationNamespace(newschema); - if (oldNspOid == nspOid) - ereport(ERROR, - (errcode(ERRCODE_DUPLICATE_TABLE), - errmsg("relation \"%s\" is already in schema \"%s\"", - RelationGetRelationName(rel), - newschema))); - - /* disallow renaming into or out of temp schemas */ - if (isAnyTempNamespace(nspOid) || isAnyTempNamespace(oldNspOid)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot move objects into or out of temporary schemas"))); - - /* same for TOAST schema */ - if (nspOid == PG_TOAST_NAMESPACE || oldNspOid == PG_TOAST_NAMESPACE) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot move objects into or out of TOAST schema"))); + /* common checks on switching namespaces */ + CheckSetNamespace(oldNspOid, nspOid, RelationRelationId, relid); /* OK, modify the pg_class row and pg_depend entry */ classRel = heap_open(RelationRelationId, RowExclusiveLock); diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 2f21451abd..583bba37f5 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -2828,24 +2828,8 @@ AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, oldNspOid = typform->typnamespace; arrayOid = typform->typarray; - if (oldNspOid == nspOid) - ereport(ERROR, - (errcode(ERRCODE_DUPLICATE_OBJECT), - errmsg("type %s is already in schema \"%s\"", - format_type_be(typeOid), - get_namespace_name(nspOid)))); - - /* disallow renaming into or out of temp schemas */ - if (isAnyTempNamespace(nspOid) || isAnyTempNamespace(oldNspOid)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot move objects into or out of temporary schemas"))); - - /* same for TOAST schema */ - if (nspOid == PG_TOAST_NAMESPACE || oldNspOid == PG_TOAST_NAMESPACE) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot move objects into or out of TOAST schema"))); + /* common checks on switching namespaces */ + CheckSetNamespace(oldNspOid, nspOid, TypeRelationId, typeOid); /* check for duplicate name (more friendly than unique-index failure) */ if (SearchSysCacheExists2(TYPENAMENSP, diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l index b51fd1dd54..3b827958f5 100644 --- a/src/backend/utils/misc/guc-file.l +++ b/src/backend/utils/misc/guc-file.l @@ -50,7 +50,7 @@ static unsigned int ConfigFileLineno; int GUC_yylex(void); static bool ParseConfigFile(const char *config_file, const char *calling_file, - int depth, GucContext context, int elevel, + int depth, int elevel, struct name_value_pair **head_p, struct name_value_pair **tail_p); static void free_name_value_list(struct name_value_pair * list); @@ -140,9 +140,7 @@ ProcessConfigFile(GucContext context) /* Parse the file into a list of option names and values */ head = tail = NULL; - if (!ParseConfigFile(ConfigFileName, NULL, - 0, context, elevel, - &head, &tail)) + if (!ParseConfigFile(ConfigFileName, NULL, 0, elevel, &head, &tail)) goto cleanup_list; /* @@ -368,7 +366,6 @@ ProcessConfigFile(GucContext context) * calling_file: absolute path of file containing the "include" directive, * or NULL at outer level (config_file must be absolute at outer level) * depth: recursion depth (used only to prevent infinite recursion) - * context: GucContext passed to ProcessConfigFile() * elevel: error logging level determined by ProcessConfigFile() * Output parameters: * head_p, tail_p: head and tail of linked list of name/value pairs @@ -389,7 +386,7 @@ ProcessConfigFile(GucContext context) */ static bool ParseConfigFile(const char *config_file, const char *calling_file, - int depth, GucContext context, int elevel, + int depth, int elevel, struct name_value_pair **head_p, struct name_value_pair **tail_p) { @@ -496,7 +493,7 @@ ParseConfigFile(const char *config_file, const char *calling_file, unsigned int save_ConfigFileLineno = ConfigFileLineno; if (!ParseConfigFile(opt_value, config_file, - depth + 1, context, elevel, + depth + 1, elevel, head_p, tail_p)) { pfree(opt_name); diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h index dcc53be56b..a2792606ab 100644 --- a/src/include/catalog/dependency.h +++ b/src/include/catalog/dependency.h @@ -166,6 +166,7 @@ extern void recordDependencyOnSingleRelExpr(const ObjectAddress *depender, extern ObjectClass getObjectClass(const ObjectAddress *object); extern char *getObjectDescription(const ObjectAddress *object); +extern char *getObjectDescriptionOids(Oid classid, Oid objid); extern ObjectAddresses *new_object_addresses(void); diff --git a/src/include/catalog/namespace.h b/src/include/catalog/namespace.h index c6672e955e..a842ea7ee6 100644 --- a/src/include/catalog/namespace.h +++ b/src/include/catalog/namespace.h @@ -94,6 +94,8 @@ extern Oid LookupExplicitNamespace(const char *nspname); extern Oid get_namespace_oid(const char *nspname, bool missing_ok); extern Oid LookupCreationNamespace(const char *nspname); +extern void CheckSetNamespace(Oid oldNspOid, Oid nspOid, Oid classid, + Oid objid); extern Oid QualifiedNameGetCreationNamespace(List *names, char **objname_p); extern RangeVar *makeRangeVarFromNameList(List *names); extern char *NameListToString(List *names); diff --git a/src/test/regress/expected/text.out b/src/test/regress/expected/text.out index 70818389e4..b84e8544d5 100644 --- a/src/test/regress/expected/text.out +++ b/src/test/regress/expected/text.out @@ -52,7 +52,7 @@ LINE 1: select 3 || 4.0; ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. /* - * string functions + * various string functions */ select concat('one'); concat @@ -118,6 +118,27 @@ select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) ord 5 | ahoj | ahoj (11 rows) +select quote_literal(''); + quote_literal +--------------- + '' +(1 row) + +select quote_literal('abc'''); + quote_literal +--------------- + 'abc''' +(1 row) + +select quote_literal(e'\\'); + quote_literal +--------------- + E'\\' +(1 row) + +/* + * format + */ select format(NULL); format -------- diff --git a/src/test/regress/sql/text.sql b/src/test/regress/sql/text.sql index 563e2589ad..96e425d3cf 100644 --- a/src/test/regress/sql/text.sql +++ b/src/test/regress/sql/text.sql @@ -30,7 +30,7 @@ select 'four: ' || 2+2; select 3 || 4.0; /* - * string functions + * various string functions */ select concat('one'); select concat(1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); @@ -41,7 +41,13 @@ select concat_ws('',10,20,null,30); select concat_ws(NULL,10,20,null,30) is null; select reverse('abcde'); select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) order by i; +select quote_literal(''); +select quote_literal('abc'''); +select quote_literal(e'\\'); +/* + * format + */ select format(NULL); select format('Hello'); select format('Hello %s', 'World'); |
