summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShigeru Hanada2010-11-23 05:25:25 +0000
committerShigeru Hanada2010-11-23 05:25:25 +0000
commit59f1ce7272e88f478229135efe187589f062f023 (patch)
tree22cf21ea28512c1ba1ccea793317ac9164355650
parente3b870878616f5e816166165494abc3857d32ac5 (diff)
parent44475e782f4674d257b9e5c1a3930218a4b4deea (diff)
Merge branch 'master' into fdw_select_simplefdw_select_simple
-rw-r--r--src/backend/catalog/dependency.c15
-rw-r--r--src/backend/catalog/namespace.c34
-rw-r--r--src/backend/commands/functioncmds.c20
-rw-r--r--src/backend/commands/tablecmds.c20
-rw-r--r--src/backend/commands/typecmds.c20
-rw-r--r--src/backend/utils/misc/guc-file.l11
-rw-r--r--src/include/catalog/dependency.h1
-rw-r--r--src/include/catalog/namespace.h2
-rw-r--r--src/test/regress/expected/text.out23
-rw-r--r--src/test/regress/sql/text.sql8
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');