From d85286305d13f525f364a4a42d2ad0af4bdce6bd Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 21 Jul 2003 01:59:11 +0000 Subject: [PATCH] Error message editing in backend/catalog. --- src/backend/catalog/aclchk.c | 162 ++++++++++++++++++++--------- src/backend/catalog/dependency.c | 132 ++++++++++++----------- src/backend/catalog/heap.c | 119 +++++++++++++-------- src/backend/catalog/index.c | 76 +++++++------- src/backend/catalog/namespace.c | 90 ++++++++++------ src/backend/catalog/pg_aggregate.c | 55 ++++++---- src/backend/catalog/pg_constraint.c | 14 ++- src/backend/catalog/pg_conversion.c | 30 ++++-- src/backend/catalog/pg_largeobject.c | 6 +- src/backend/catalog/pg_namespace.c | 6 +- src/backend/catalog/pg_operator.c | 52 +++++---- src/backend/catalog/pg_proc.c | 8 +- src/backend/catalog/pg_type.c | 30 ++++-- src/include/utils/acl.h | 4 +- src/include/utils/elog.h | 7 +- src/test/regress/expected/alter_table.out | 28 ++--- src/test/regress/expected/conversion.out | 4 +- src/test/regress/expected/create_type.out | 2 +- src/test/regress/expected/domain.out | 4 +- src/test/regress/expected/errors.out | 12 +-- src/test/regress/expected/foreign_key.out | 8 +- src/test/regress/expected/polymorphism.out | 54 ++++++---- src/test/regress/expected/privileges.out | 72 ++++++------- src/test/regress/expected/temp.out | 4 +- 24 files changed, 600 insertions(+), 379 deletions(-) diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c index c6af2c3213..21464fa126 100644 --- a/src/backend/catalog/aclchk.c +++ b/src/backend/catalog/aclchk.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.83 2003/07/04 02:51:33 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.84 2003/07/21 01:59:07 tgl Exp $ * * NOTES * See acl.h. @@ -119,7 +119,9 @@ merge_acl_with_grant(Acl *old_acl, bool is_grant, * the situation is impossible to clean up. */ if (is_grant && idtype != ACL_IDTYPE_UID && grant_option) - elog(ERROR, "grant options can only be granted to individual users"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_GRANT_OPERATION), + errmsg("grant options can only be granted to individual users"))); aclitem.ai_grantor = GetUserId(); @@ -163,7 +165,8 @@ ExecuteGrantStmt(GrantStmt *stmt) ExecuteGrantStmt_Namespace(stmt); break; default: - elog(ERROR, "bogus GrantStmt.objtype %d", (int) stmt->objtype); + elog(ERROR, "unrecognized GrantStmt.objtype: %d", + (int) stmt->objtype); } } @@ -183,8 +186,10 @@ ExecuteGrantStmt_Relation(GrantStmt *stmt) AclMode priv = lfirsti(i); if (priv & ~((AclMode) ACL_ALL_RIGHTS_RELATION)) - elog(ERROR, "invalid privilege type %s for table object", - privilege_to_string(priv)); + ereport(ERROR, + (errcode(ERRCODE_INVALID_GRANT_OPERATION), + errmsg("invalid privilege type %s for table", + privilege_to_string(priv)))); privileges |= priv; } } @@ -212,7 +217,7 @@ ExecuteGrantStmt_Relation(GrantStmt *stmt) ObjectIdGetDatum(relOid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "relation %u not found", relOid); + elog(ERROR, "cache lookup failed for relation %u", relOid); pg_class_tuple = (Form_pg_class) GETSTRUCT(tuple); if (stmt->is_grant @@ -220,9 +225,12 @@ ExecuteGrantStmt_Relation(GrantStmt *stmt) && pg_class_aclcheck(relOid, GetUserId(), ACL_GRANT_OPTION_FOR(privileges)) != ACLCHECK_OK) aclcheck_error(ACLCHECK_NO_PRIV, relvar->relname); + /* Not sensible to grant on an index */ if (pg_class_tuple->relkind == RELKIND_INDEX) - elog(ERROR, "\"%s\" is an index", - relvar->relname); + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is an index", + relvar->relname))); /* * If there's no ACL, create a default using the pg_class.relowner @@ -281,8 +289,10 @@ ExecuteGrantStmt_Database(GrantStmt *stmt) AclMode priv = lfirsti(i); if (priv & ~((AclMode) ACL_ALL_RIGHTS_DATABASE)) - elog(ERROR, "invalid privilege type %s for database object", - privilege_to_string(priv)); + ereport(ERROR, + (errcode(ERRCODE_INVALID_GRANT_OPERATION), + errmsg("invalid privilege type %s for database", + privilege_to_string(priv)))); privileges |= priv; } } @@ -311,7 +321,9 @@ ExecuteGrantStmt_Database(GrantStmt *stmt) scan = heap_beginscan(relation, SnapshotNow, 1, entry); tuple = heap_getnext(scan, ForwardScanDirection); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "database \"%s\" not found", dbname); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_DATABASE), + errmsg("database \"%s\" does not exist", dbname))); pg_database_tuple = (Form_pg_database) GETSTRUCT(tuple); if (stmt->is_grant @@ -375,8 +387,10 @@ ExecuteGrantStmt_Function(GrantStmt *stmt) AclMode priv = lfirsti(i); if (priv & ~((AclMode) ACL_ALL_RIGHTS_FUNCTION)) - elog(ERROR, "invalid privilege type %s for function object", - privilege_to_string(priv)); + ereport(ERROR, + (errcode(ERRCODE_INVALID_GRANT_OPERATION), + errmsg("invalid privilege type %s for function", + privilege_to_string(priv)))); privileges |= priv; } } @@ -404,7 +418,7 @@ ExecuteGrantStmt_Function(GrantStmt *stmt) ObjectIdGetDatum(oid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "function %u not found", oid); + elog(ERROR, "cache lookup failed for function %u", oid); pg_proc_tuple = (Form_pg_proc) GETSTRUCT(tuple); if (stmt->is_grant @@ -470,8 +484,10 @@ ExecuteGrantStmt_Language(GrantStmt *stmt) AclMode priv = lfirsti(i); if (priv & ~((AclMode) ACL_ALL_RIGHTS_LANGUAGE)) - elog(ERROR, "invalid privilege type %s for language object", - privilege_to_string(priv)); + ereport(ERROR, + (errcode(ERRCODE_INVALID_GRANT_OPERATION), + errmsg("invalid privilege type %s for language", + privilege_to_string(priv)))); privileges |= priv; } } @@ -496,11 +512,15 @@ ExecuteGrantStmt_Language(GrantStmt *stmt) PointerGetDatum(langname), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "language \"%s\" not found", langname); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("language \"%s\" does not exist", langname))); pg_language_tuple = (Form_pg_language) GETSTRUCT(tuple); if (!pg_language_tuple->lanpltrusted && stmt->is_grant) - elog(ERROR, "language \"%s\" is not trusted", langname); + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("language \"%s\" is not trusted", langname))); if (stmt->is_grant && !superuser() @@ -563,8 +583,10 @@ ExecuteGrantStmt_Namespace(GrantStmt *stmt) AclMode priv = lfirsti(i); if (priv & ~((AclMode) ACL_ALL_RIGHTS_NAMESPACE)) - elog(ERROR, "invalid privilege type %s for namespace object", - privilege_to_string(priv)); + ereport(ERROR, + (errcode(ERRCODE_INVALID_GRANT_OPERATION), + errmsg("invalid privilege type %s for schema", + privilege_to_string(priv)))); privileges |= priv; } } @@ -589,7 +611,9 @@ ExecuteGrantStmt_Namespace(GrantStmt *stmt) CStringGetDatum(nspname), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "namespace \"%s\" not found", nspname); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("schema \"%s\" does not exist", nspname))); pg_namespace_tuple = (Form_pg_namespace) GETSTRUCT(tuple); if (stmt->is_grant @@ -668,8 +692,7 @@ privilege_to_string(AclMode privilege) case ACL_CREATE_TEMP: return "TEMP"; default: - elog(ERROR, "privilege_to_string: unrecognized privilege %d", - privilege); + elog(ERROR, "unrecognized privilege: %d", (int) privilege); } return NULL; /* appease compiler */ } @@ -690,7 +713,9 @@ get_grosysid(char *groname) ReleaseSysCache(tuple); } else - elog(ERROR, "non-existent group \"%s\"", groname); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("group \"%s\" does not exist", groname))); return id; } @@ -760,7 +785,9 @@ in_group(AclId uid, AclId gid) ReleaseSysCache(tuple); } else - elog(WARNING, "in_group: group %u not found", gid); + ereport(WARNING, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("group with ID %u does not exist", gid))); return result; } @@ -785,7 +812,7 @@ aclcheck(Acl *acl, AclId userid, AclMode mode) */ if (acl == NULL) { - elog(ERROR, "aclcheck: internal error -- null ACL"); + elog(ERROR, "null ACL"); return ACLCHECK_NO_PRIV; } @@ -823,22 +850,25 @@ aclcheck(Acl *acl, AclId userid, AclMode mode) * Standardized reporting of aclcheck permissions failures. */ void -aclcheck_error(AclResult errcode, const char *objectname) +aclcheck_error(AclResult aclerr, const char *objectname) { - switch (errcode) + switch (aclerr) { case ACLCHECK_OK: /* no error, so return to caller */ break; case ACLCHECK_NO_PRIV: - elog(ERROR, "%s: permission denied", objectname); + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied for \"%s\"", objectname))); break; case ACLCHECK_NOT_OWNER: - elog(ERROR, "%s: must be owner", objectname); + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be owner of \"%s\"", objectname))); break; default: - elog(ERROR, "%s: unexpected AclResult %d", - objectname, (int) errcode); + elog(ERROR, "unrecognized AclResult: %d", (int) aclerr); break; } } @@ -846,6 +876,11 @@ aclcheck_error(AclResult errcode, const char *objectname) /* * Exported routine for checking a user's access privileges to a table + * + * Note: we give lookup failure the full ereport treatment because the + * has_table_privilege() family of functions allow users to pass + * any random OID to this function. Likewise for the sibling functions + * below. */ AclResult pg_class_aclcheck(Oid table_oid, AclId userid, AclMode mode) @@ -865,7 +900,9 @@ pg_class_aclcheck(Oid table_oid, AclId userid, AclMode mode) ObjectIdGetDatum(userid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "pg_class_aclcheck: invalid user id %u", userid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("user with ID %u does not exist", userid))); usecatupd = ((Form_pg_shadow) GETSTRUCT(tuple))->usecatupd; @@ -880,7 +917,9 @@ pg_class_aclcheck(Oid table_oid, AclId userid, AclMode mode) ObjectIdGetDatum(table_oid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "pg_class_aclcheck: relation %u not found", table_oid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_TABLE), + errmsg("relation with OID %u does not exist", table_oid))); /* * Deny anyone permission to update a system catalog unless @@ -893,7 +932,7 @@ pg_class_aclcheck(Oid table_oid, AclId userid, AclMode mode) !usecatupd) { #ifdef ACLDEBUG - elog(DEBUG2, "pg_class_aclcheck: catalog update: permission denied"); + elog(DEBUG2, "permission denied for system catalog update"); #endif ReleaseSysCache(tuple); return ACLCHECK_NO_PRIV; @@ -905,7 +944,7 @@ pg_class_aclcheck(Oid table_oid, AclId userid, AclMode mode) if (usesuper) { #ifdef ACLDEBUG - elog(DEBUG2, "pg_class_aclcheck: %u is superuser", userid); + elog(DEBUG2, "%u is superuser, home free", userid); #endif ReleaseSysCache(tuple); return ACLCHECK_OK; @@ -973,7 +1012,9 @@ pg_database_aclcheck(Oid db_oid, AclId userid, AclMode mode) scan = heap_beginscan(pg_database, SnapshotNow, 1, entry); tuple = heap_getnext(scan, ForwardScanDirection); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "pg_database_aclcheck: database %u not found", db_oid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_DATABASE), + errmsg("database with OID %u does not exist", db_oid))); aclDatum = heap_getattr(tuple, Anum_pg_database_datacl, RelationGetDescr(pg_database), &isNull); @@ -1028,7 +1069,9 @@ pg_proc_aclcheck(Oid proc_oid, AclId userid, AclMode mode) ObjectIdGetDatum(proc_oid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "pg_proc_aclcheck: function %u not found", proc_oid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_FUNCTION), + errmsg("function with OID %u does not exist", proc_oid))); aclDatum = SysCacheGetAttr(PROCOID, tuple, Anum_pg_proc_proacl, &isNull); @@ -1075,13 +1118,15 @@ pg_language_aclcheck(Oid lang_oid, AclId userid, AclMode mode) return ACLCHECK_OK; /* - * Get the function's ACL from pg_language + * Get the language's ACL from pg_language */ tuple = SearchSysCache(LANGOID, ObjectIdGetDatum(lang_oid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "pg_language_aclcheck: language %u not found", lang_oid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("language with OID %u does not exist", lang_oid))); aclDatum = SysCacheGetAttr(LANGOID, tuple, Anum_pg_language_lanacl, &isNull); @@ -1132,13 +1177,15 @@ pg_namespace_aclcheck(Oid nsp_oid, AclId userid, AclMode mode) return ACLCHECK_OK; /* - * Get the function's ACL from pg_namespace + * Get the schema's ACL from pg_namespace */ tuple = SearchSysCache(NAMESPACEOID, ObjectIdGetDatum(nsp_oid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "pg_namespace_aclcheck: namespace %u not found", nsp_oid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("schema with OID %u does not exist", nsp_oid))); aclDatum = SysCacheGetAttr(NAMESPACEOID, tuple, Anum_pg_namespace_nspacl, &isNull); @@ -1186,7 +1233,9 @@ pg_class_ownercheck(Oid class_oid, AclId userid) ObjectIdGetDatum(class_oid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "pg_class_ownercheck: relation %u not found", class_oid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_TABLE), + errmsg("relation with OID %u does not exist", class_oid))); owner_id = ((Form_pg_class) GETSTRUCT(tuple))->relowner; @@ -1212,7 +1261,9 @@ pg_type_ownercheck(Oid type_oid, AclId userid) ObjectIdGetDatum(type_oid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "pg_type_ownercheck: type %u not found", type_oid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("type with OID %u does not exist", type_oid))); owner_id = ((Form_pg_type) GETSTRUCT(tuple))->typowner; @@ -1238,7 +1289,9 @@ pg_oper_ownercheck(Oid oper_oid, AclId userid) ObjectIdGetDatum(oper_oid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "pg_oper_ownercheck: operator %u not found", oper_oid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_FUNCTION), + errmsg("operator with OID %u does not exist", oper_oid))); owner_id = ((Form_pg_operator) GETSTRUCT(tuple))->oprowner; @@ -1264,7 +1317,9 @@ pg_proc_ownercheck(Oid proc_oid, AclId userid) ObjectIdGetDatum(proc_oid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "pg_proc_ownercheck: function %u not found", proc_oid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_FUNCTION), + errmsg("function with OID %u does not exist", proc_oid))); owner_id = ((Form_pg_proc) GETSTRUCT(tuple))->proowner; @@ -1290,8 +1345,9 @@ pg_namespace_ownercheck(Oid nsp_oid, AclId userid) ObjectIdGetDatum(nsp_oid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "pg_namespace_ownercheck: namespace %u not found", - nsp_oid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("schema with OID %u does not exist", nsp_oid))); owner_id = ((Form_pg_namespace) GETSTRUCT(tuple))->nspowner; @@ -1317,8 +1373,10 @@ pg_opclass_ownercheck(Oid opc_oid, AclId userid) ObjectIdGetDatum(opc_oid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "pg_opclass_ownercheck: operator class %u not found", - opc_oid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("operator class with OID %u does not exist", + opc_oid))); owner_id = ((Form_pg_opclass) GETSTRUCT(tuple))->opcowner; @@ -1354,7 +1412,9 @@ pg_database_ownercheck(Oid db_oid, AclId userid) dbtuple = heap_getnext(scan, ForwardScanDirection); if (!HeapTupleIsValid(dbtuple)) - elog(ERROR, "database %u does not exist", db_oid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_DATABASE), + errmsg("database with OID %u does not exist", db_oid))); dba = ((Form_pg_database) GETSTRUCT(dbtuple))->datdba; diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index 80a4cebf06..93c0fdf51f 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/dependency.c,v 1.26 2003/06/29 00:33:42 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/dependency.c,v 1.27 2003/07/21 01:59:07 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -168,9 +168,11 @@ performDeletion(const ObjectAddress *object, if (!recursiveDeletion(object, behavior, NOTICE, NULL, &oktodelete, depRel)) - elog(ERROR, "Cannot drop %s because other objects depend on it" - "\n\tUse DROP ... CASCADE to drop the dependent objects too", - objDescription); + ereport(ERROR, + (errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST), + errmsg("cannot drop %s because other objects depend on it", + objDescription), + errhint("Use DROP ... CASCADE to drop the dependent objects too."))); term_object_addresses(&oktodelete); @@ -226,8 +228,10 @@ deleteWhatDependsOn(const ObjectAddress *object, DROP_CASCADE, showNotices ? NOTICE : DEBUG2, &oktodelete, depRel)) - elog(ERROR, "Failed to drop all objects depending on %s", - objDescription); + ereport(ERROR, + (errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST), + errmsg("failed to drop all objects depending on %s", + objDescription))); /* * We do not need CommandCounterIncrement here, since if step 2 did @@ -316,15 +320,17 @@ findAutoDeletableObjects(const ObjectAddress *object, break; case DEPENDENCY_PIN: /* - * For a PIN dependency we just elog immediately; there + * For a PIN dependency we just ereport immediately; there * won't be any others to examine, and we aren't ever * going to let the user delete it. */ - elog(ERROR, "Cannot drop %s because it is required by the database system", - getObjectDescription(object)); + ereport(ERROR, + (errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST), + errmsg("cannot drop %s because it is required by the database system", + getObjectDescription(object)))); break; default: - elog(ERROR, "findAutoDeletableObjects: unknown dependency type '%c' for %s", + elog(ERROR, "unrecognized dependency type '%c' for %s", foundDep->deptype, getObjectDescription(object)); break; } @@ -349,7 +355,7 @@ findAutoDeletableObjects(const ObjectAddress *object, * depRel is the already-open pg_depend relation. * * - * In RESTRICT mode, we perform all the deletions anyway, but elog a message + * In RESTRICT mode, we perform all the deletions anyway, but ereport a message * and return FALSE if we find a restriction violation. performDeletion * will then abort the transaction to nullify the deletions. We have to * do it this way to (a) report all the direct and indirect dependencies @@ -447,16 +453,19 @@ recursiveDeletion(const ObjectAddress *object, * another object. We have three cases: * * 1. At the outermost recursion level, disallow the DROP. - * (We just elog here, rather than proceeding, since no + * (We just ereport here, rather than proceeding, since no * other dependencies are likely to be interesting.) */ if (callingObject == NULL) { char *otherObjDesc = getObjectDescription(&otherObject); - elog(ERROR, "Cannot drop %s because %s requires it" - "\n\tYou may drop %s instead", - objDescription, otherObjDesc, otherObjDesc); + ereport(ERROR, + (errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST), + errmsg("cannot drop %s because %s requires it", + objDescription, otherObjDesc), + errhint("You may drop %s instead.", + otherObjDesc))); } /* @@ -480,7 +489,7 @@ recursiveDeletion(const ObjectAddress *object, * owning object to recurse back to me. */ if (amOwned) /* shouldn't happen */ - elog(ERROR, "recursiveDeletion: multiple INTERNAL dependencies for %s", + elog(ERROR, "multiple INTERNAL dependencies for %s", objDescription); owningObject = otherObject; amOwned = true; @@ -492,11 +501,11 @@ recursiveDeletion(const ObjectAddress *object, * Should not happen; PIN dependencies should have zeroes * in the depender fields... */ - elog(ERROR, "recursiveDeletion: incorrect use of PIN dependency with %s", + elog(ERROR, "incorrect use of PIN dependency with %s", objDescription); break; default: - elog(ERROR, "recursiveDeletion: unknown dependency type '%c' for %s", + elog(ERROR, "unrecognized dependency type '%c' for %s", foundDep->deptype, objDescription); break; } @@ -522,18 +531,21 @@ recursiveDeletion(const ObjectAddress *object, if (amOwned) { if (object_address_present(&owningObject, oktodelete)) - elog(DEBUG2, "Drop auto-cascades to %s", - getObjectDescription(&owningObject)); + ereport(DEBUG2, + (errmsg("drop auto-cascades to %s", + getObjectDescription(&owningObject)))); else if (behavior == DROP_RESTRICT) { - elog(msglevel, "%s depends on %s", - getObjectDescription(&owningObject), - objDescription); + ereport(msglevel, + (errmsg("%s depends on %s", + getObjectDescription(&owningObject), + objDescription))); ok = false; } else - elog(msglevel, "Drop cascades to %s", - getObjectDescription(&owningObject)); + ereport(msglevel, + (errmsg("drop cascades to %s", + getObjectDescription(&owningObject)))); if (!recursiveDeletion(&owningObject, behavior, msglevel, object, oktodelete, depRel)) @@ -669,18 +681,21 @@ deleteDependentObjects(const ObjectAddress *object, * In that case, act like this link is AUTO, too. */ if (object_address_present(&otherObject, oktodelete)) - elog(DEBUG2, "Drop auto-cascades to %s", - getObjectDescription(&otherObject)); + ereport(DEBUG2, + (errmsg("drop auto-cascades to %s", + getObjectDescription(&otherObject)))); else if (behavior == DROP_RESTRICT) { - elog(msglevel, "%s depends on %s", - getObjectDescription(&otherObject), - objDescription); + ereport(msglevel, + (errmsg("%s depends on %s", + getObjectDescription(&otherObject), + objDescription))); ok = false; } else - elog(msglevel, "Drop cascades to %s", - getObjectDescription(&otherObject)); + ereport(msglevel, + (errmsg("drop cascades to %s", + getObjectDescription(&otherObject)))); if (!recursiveDeletion(&otherObject, behavior, msglevel, object, oktodelete, depRel)) @@ -694,8 +709,9 @@ deleteDependentObjects(const ObjectAddress *object, * RESTRICT case. (However, normal dependencies on the * component object could still cause failure.) */ - elog(DEBUG2, "Drop auto-cascades to %s", - getObjectDescription(&otherObject)); + ereport(DEBUG2, + (errmsg("drop auto-cascades to %s", + getObjectDescription(&otherObject)))); if (!recursiveDeletion(&otherObject, behavior, msglevel, object, oktodelete, depRel)) @@ -704,14 +720,16 @@ deleteDependentObjects(const ObjectAddress *object, case DEPENDENCY_PIN: /* - * For a PIN dependency we just elog immediately; there + * For a PIN dependency we just ereport immediately; there * won't be any others to report. */ - elog(ERROR, "Cannot drop %s because it is required by the database system", - objDescription); + ereport(ERROR, + (errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST), + errmsg("cannot drop %s because it is required by the database system", + objDescription))); break; default: - elog(ERROR, "recursiveDeletion: unknown dependency type '%c' for %s", + elog(ERROR, "unrecognized dependency type '%c' for %s", foundDep->deptype, objDescription); break; } @@ -800,7 +818,7 @@ doDeletion(const ObjectAddress *object) break; default: - elog(ERROR, "doDeletion: Unsupported object class %u", + elog(ERROR, "unrecognized object class: %u", object->classId); } } @@ -968,12 +986,10 @@ find_expr_references_walker(Node *node, rtables = lnext(rtables); } if (rtables == NIL) - elog(ERROR, "find_expr_references_walker: bogus varlevelsup %d", - var->varlevelsup); + elog(ERROR, "invalid varlevelsup %d", var->varlevelsup); rtable = lfirst(rtables); if (var->varno <= 0 || var->varno > length(rtable)) - elog(ERROR, "find_expr_references_walker: bogus varno %d", - var->varno); + elog(ERROR, "invalid varno %d", var->varno); rte = rt_fetch(var->varno, rtable); if (rte->rtekind == RTE_RELATION) { @@ -992,8 +1008,7 @@ find_expr_references_walker(Node *node, context->rtables = rtables; if (var->varattno <= 0 || var->varattno > length(rte->joinaliasvars)) - elog(ERROR, "find_expr_references_walker: bogus varattno %d", - var->varattno); + elog(ERROR, "invalid varattno %d", var->varattno); find_expr_references_walker((Node *) nth(var->varattno - 1, rte->joinaliasvars), context); @@ -1064,7 +1079,7 @@ find_expr_references_walker(Node *node, if (is_subplan(node)) { /* Extra work needed here if we ever need this case */ - elog(ERROR, "find_expr_references_walker: already-planned subqueries not supported"); + elog(ERROR, "already-planned subqueries not supported"); } if (IsA(node, Query)) { @@ -1400,8 +1415,7 @@ getObjectClass(const ObjectAddress *object) return OCLASS_SCHEMA; } - elog(ERROR, "getObjectClass: Unknown object class %u", - object->classId); + elog(ERROR, "unrecognized object class: %u", object->classId); return OCLASS_CLASS; /* keep compiler quiet */ } @@ -1457,7 +1471,7 @@ getObjectDescription(const ObjectAddress *object) tup = systable_getnext(rcscan); if (!HeapTupleIsValid(tup)) - elog(ERROR, "getObjectDescription: Cast %u does not exist", + elog(ERROR, "could not find tuple for cast %u", object->objectId); castForm = (Form_pg_cast) GETSTRUCT(tup); @@ -1491,7 +1505,7 @@ getObjectDescription(const ObjectAddress *object) tup = systable_getnext(rcscan); if (!HeapTupleIsValid(tup)) - elog(ERROR, "getObjectDescription: Constraint %u does not exist", + elog(ERROR, "could not find tuple for constraint %u", object->objectId); con = (Form_pg_constraint) GETSTRUCT(tup); @@ -1521,7 +1535,7 @@ getObjectDescription(const ObjectAddress *object) ObjectIdGetDatum(object->objectId), 0, 0, 0); if (!HeapTupleIsValid(conTup)) - elog(ERROR, "getObjectDescription: Conversion %u does not exist", + elog(ERROR, "cache lookup failed for conversion %u", object->objectId); appendStringInfo(&buffer, "conversion %s", NameStr(((Form_pg_conversion) GETSTRUCT(conTup))->conname)); @@ -1550,7 +1564,7 @@ getObjectDescription(const ObjectAddress *object) tup = systable_getnext(adscan); if (!HeapTupleIsValid(tup)) - elog(ERROR, "getObjectDescription: Default %u does not exist", + elog(ERROR, "could not find tuple for attrdef %u", object->objectId); attrdef = (Form_pg_attrdef) GETSTRUCT(tup); @@ -1575,7 +1589,7 @@ getObjectDescription(const ObjectAddress *object) ObjectIdGetDatum(object->objectId), 0, 0, 0); if (!HeapTupleIsValid(langTup)) - elog(ERROR, "getObjectDescription: Language %u does not exist", + elog(ERROR, "cache lookup failed for language %u", object->objectId); appendStringInfo(&buffer, "language %s", NameStr(((Form_pg_language) GETSTRUCT(langTup))->lanname)); @@ -1600,7 +1614,7 @@ getObjectDescription(const ObjectAddress *object) ObjectIdGetDatum(object->objectId), 0, 0, 0); if (!HeapTupleIsValid(opcTup)) - elog(ERROR, "cache lookup of opclass %u failed", + elog(ERROR, "cache lookup failed for opclass %u", object->objectId); opcForm = (Form_pg_opclass) GETSTRUCT(opcTup); @@ -1618,7 +1632,7 @@ getObjectDescription(const ObjectAddress *object) ObjectIdGetDatum(opcForm->opcamid), 0, 0, 0); if (!HeapTupleIsValid(amTup)) - elog(ERROR, "syscache lookup for AM %u failed", + elog(ERROR, "cache lookup failed for access method %u", opcForm->opcamid); amForm = (Form_pg_am) GETSTRUCT(amTup); @@ -1650,7 +1664,7 @@ getObjectDescription(const ObjectAddress *object) tup = systable_getnext(rcscan); if (!HeapTupleIsValid(tup)) - elog(ERROR, "getObjectDescription: Rule %u does not exist", + elog(ERROR, "could not find tuple for rule %u", object->objectId); rule = (Form_pg_rewrite) GETSTRUCT(tup); @@ -1684,7 +1698,7 @@ getObjectDescription(const ObjectAddress *object) tup = systable_getnext(tgscan); if (!HeapTupleIsValid(tup)) - elog(ERROR, "getObjectDescription: Trigger %u does not exist", + elog(ERROR, "could not find tuple for trigger %u", object->objectId); trig = (Form_pg_trigger) GETSTRUCT(tup); @@ -1704,7 +1718,7 @@ getObjectDescription(const ObjectAddress *object) nspname = get_namespace_name(object->objectId); if (!nspname) - elog(ERROR, "getObjectDescription: Schema %u does not exist", + elog(ERROR, "cache lookup failed for namespace %u", object->objectId); appendStringInfo(&buffer, "schema %s", nspname); break; @@ -1736,7 +1750,7 @@ getRelationDescription(StringInfo buffer, Oid relid) ObjectIdGetDatum(relid), 0, 0, 0); if (!HeapTupleIsValid(relTup)) - elog(ERROR, "cache lookup of relation %u failed", relid); + elog(ERROR, "cache lookup failed for relation %u", relid); relForm = (Form_pg_class) GETSTRUCT(relTup); /* Qualify the name if not visible in search path */ diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index b8850d0b92..61558be843 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.247 2003/07/20 21:56:32 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.248 2003/07/21 01:59:08 tgl Exp $ * * * INTERFACE ROUTINES @@ -147,17 +147,16 @@ static Form_pg_attribute SysAtt[] = {&a1, &a2, &a3, &a4, &a5, &a6, &a7}; /* * This function returns a Form_pg_attribute pointer for a system attribute. - * Note that we elog if the presented attno is invalid. + * Note that we elog if the presented attno is invalid, which would only + * happen if there's a problem upstream. */ Form_pg_attribute SystemAttributeDefinition(AttrNumber attno, bool relhasoids) { if (attno >= 0 || attno < -(int) lengthof(SysAtt)) - elog(ERROR, "SystemAttributeDefinition: invalid attribute number %d", - attno); + elog(ERROR, "invalid system attribute number %d", attno); if (attno == ObjectIdAttributeNumber && !relhasoids) - elog(ERROR, "SystemAttributeDefinition: invalid attribute number %d", - attno); + elog(ERROR, "invalid system attribute number %d", attno); return SysAtt[-attno - 1]; } @@ -223,9 +222,11 @@ heap_create(const char *relname, if (!allow_system_table_mods && (IsSystemNamespace(relnamespace) || IsToastNamespace(relnamespace)) && IsNormalProcessingMode()) - elog(ERROR, "cannot create %s.%s: " - "system catalog modifications are currently disallowed", - get_namespace_name(relnamespace), relname); + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied to create \"%s.%s\"", + get_namespace_name(relnamespace), relname), + errdetail("System catalog modifications are currently disallowed."))); /* * Real ugly stuff to assign the proper relid in the relation @@ -338,7 +339,7 @@ heap_storage_create(Relation rel) * * this is used to make certain the tuple descriptor contains a * valid set of attribute names and datatypes. a problem simply - * generates elog(ERROR) which aborts the current transaction. + * generates ereport(ERROR) which aborts the current transaction. * -------------------------------- */ void @@ -367,8 +368,10 @@ CheckAttributeNamesTypes(TupleDesc tupdesc, char relkind) { if (SystemAttributeByName(NameStr(tupdesc->attrs[i]->attname), tupdesc->tdhasoid) != NULL) - elog(ERROR, "name of column \"%s\" conflicts with an existing system column", - NameStr(tupdesc->attrs[i]->attname)); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_COLUMN), + errmsg("column name \"%s\" conflicts with a system column name", + NameStr(tupdesc->attrs[i]->attname)))); } } @@ -381,8 +384,10 @@ CheckAttributeNamesTypes(TupleDesc tupdesc, char relkind) { if (strcmp(NameStr(tupdesc->attrs[j]->attname), NameStr(tupdesc->attrs[i]->attname)) == 0) - elog(ERROR, "column name \"%s\" is duplicated", - NameStr(tupdesc->attrs[j]->attname)); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_COLUMN), + errmsg("column name \"%s\" is duplicated", + NameStr(tupdesc->attrs[j]->attname)))); } } @@ -419,23 +424,28 @@ CheckAttributeType(const char *attname, Oid atttypid) * Berkeley-derived code that thinks it can do this...) */ if (atttypid == UNKNOWNOID) - elog(WARNING, "Attribute \"%s\" has an unknown type" - "\n\tProceeding with relation creation anyway", - attname); + ereport(WARNING, + (errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("attribute \"%s\" has type UNKNOWN", attname), + errdetail("Proceeding with relation creation anyway."))); else if (att_typtype == 'p') { /* Special hack for pg_statistic: allow ANYARRAY during initdb */ if (atttypid != ANYARRAYOID || IsUnderPostmaster) - elog(ERROR, "Attribute \"%s\" has pseudo-type %s", - attname, format_type_be(atttypid)); + ereport(ERROR, + (errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("attribute \"%s\" has pseudo-type %s", + attname, format_type_be(atttypid)))); } else if (att_typtype == 'c') { Oid typrelid = get_typ_typrelid(atttypid); if (get_rel_relkind(typrelid) == RELKIND_COMPOSITE_TYPE) - elog(ERROR, "Attribute \"%s\" has composite type %s", - attname, format_type_be(atttypid)); + ereport(ERROR, + (errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("attribute \"%s\" has composite type %s", + attname, format_type_be(atttypid)))); } } @@ -719,7 +729,9 @@ heap_create_with_catalog(const char *relname, CheckAttributeNamesTypes(tupdesc, relkind); if (get_relname_relid(relname, relnamespace)) - elog(ERROR, "Relation '%s' already exists", relname); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_TABLE), + errmsg("relation \"%s\" already exists", relname))); /* * Create the relcache entry (mostly dummy at this point) and the @@ -955,7 +967,7 @@ RemoveAttributeById(Oid relid, AttrNumber attnum) Int16GetDatum(attnum), 0, 0); if (!HeapTupleIsValid(tuple)) /* shouldn't happen */ - elog(ERROR, "RemoveAttributeById: Failed to find attribute %d in relation %u", + elog(ERROR, "cache lookup failed for attribute %d of relation %u", attnum, relid); attStruct = (Form_pg_attribute) GETSTRUCT(tuple); @@ -1047,7 +1059,7 @@ RemoveAttrDefault(Oid relid, AttrNumber attnum, heap_close(attrdef_rel, RowExclusiveLock); if (complain && !found) - elog(ERROR, "RemoveAttrDefault: no default found for rel %u attnum %d", + elog(ERROR, "could not find attrdef tuple for relation %u attnum %d", relid, attnum); } @@ -1160,8 +1172,7 @@ heap_drop_with_catalog(Oid rid) */ i = FlushRelationBuffers(rel, (BlockNumber) 0); if (i < 0) - elog(ERROR, "heap_drop_with_catalog: FlushRelationBuffers returned %d", - i); + elog(ERROR, "FlushRelationBuffers returned %d", i); /* * remove inheritance information @@ -1539,8 +1550,10 @@ AddRelationRawConstraints(Relation rel, RelationGetRelid(rel), RelationGetNamespace(rel), ccname)) - elog(ERROR, "constraint \"%s\" for relation \"%s\" already exists", - ccname, RelationGetRelationName(rel)); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("constraint \"%s\" for relation \"%s\" already exists", + ccname, RelationGetRelationName(rel)))); /* Check against other new constraints */ /* Needed because we don't do CommandCounterIncrement in loop */ foreach(listptr2, rawConstraints) @@ -1553,8 +1566,10 @@ AddRelationRawConstraints(Relation rel, cdef2->name == NULL) continue; if (strcmp(cdef2->name, ccname) == 0) - elog(ERROR, "Duplicate CHECK constraint name: '%s'", - ccname); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("CHECK constraint \"%s\" already exists", + ccname))); } } else @@ -1613,16 +1628,22 @@ AddRelationRawConstraints(Relation rel, * Make sure no outside relations are referred to. */ if (length(pstate->p_rtable) != 1) - elog(ERROR, "Only relation \"%s\" can be referenced in CHECK constraint expression", - relname); + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("only relation \"%s\" can be referenced in CHECK constraint", + relname))); /* * No subplans or aggregates, either... */ if (pstate->p_hasSubLinks) - elog(ERROR, "cannot use subselect in CHECK constraint expression"); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot use sub-select in CHECK constraint"))); if (pstate->p_hasAggs) - elog(ERROR, "cannot use aggregate function in CHECK constraint expression"); + ereport(ERROR, + (errcode(ERRCODE_GROUPING_ERROR), + errmsg("cannot use aggregate in CHECK constraint"))); /* * Constraints are evaluated with execQual, which expects an @@ -1727,21 +1748,29 @@ cookDefault(ParseState *pstate, * Make sure default expr does not refer to any vars. */ if (contain_var_clause(expr)) - elog(ERROR, "cannot use column references in DEFAULT clause"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), + errmsg("cannot use column references in DEFAULT clause"))); /* * It can't return a set either. */ if (expression_returns_set(expr)) - elog(ERROR, "DEFAULT clause must not return a set"); + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("DEFAULT clause must not return a set"))); /* * No subplans or aggregates, either... */ if (pstate->p_hasSubLinks) - elog(ERROR, "cannot use subselects in DEFAULT clause"); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot use sub-select in DEFAULT clause"))); if (pstate->p_hasAggs) - elog(ERROR, "cannot use aggregate functions in DEFAULT clause"); + ereport(ERROR, + (errcode(ERRCODE_GROUPING_ERROR), + errmsg("cannot use aggregate in DEFAULT clause"))); /* * Check that it will be possible to coerce the expression to the @@ -1762,12 +1791,14 @@ cookDefault(ParseState *pstate, atttypid, atttypmod, COERCION_ASSIGNMENT, COERCE_IMPLICIT_CAST) == NULL) - elog(ERROR, "Column \"%s\" is of type %s" - " but default expression is of type %s" - "\n\tYou will need to rewrite or cast the expression", - attname, - format_type_be(atttypid), - format_type_be(type_id)); + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("column \"%s\" is of type %s" + " but default expression is of type %s", + attname, + format_type_be(atttypid), + format_type_be(type_id)), + errhint("You will need to rewrite or cast the expression."))); } return (expr); diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 1bc66a5959..cb5a78c3da 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.211 2003/05/29 00:54:42 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.212 2003/07/21 01:59:08 tgl Exp $ * * * INTERFACE ROUTINES @@ -156,9 +156,8 @@ ConstructTupleDescriptor(Relation heapRelation, /* * here we are indexing on a normal attribute (1...n) */ - if (atnum > natts) - elog(ERROR, "cannot create index: column %d does not exist", - atnum); + if (atnum > natts) /* safety check */ + elog(ERROR, "invalid column number %d", atnum); from = heapTupDesc->attrs[AttrNumberGetAttrOffset(atnum)]; } @@ -186,7 +185,7 @@ ConstructTupleDescriptor(Relation heapRelation, /* Expressional index */ Node *indexkey; - if (indexprs == NIL) + if (indexprs == NIL) /* shouldn't happen */ elog(ERROR, "too few entries in indexprs list"); indexkey = (Node *) lfirst(indexprs); indexprs = lnext(indexprs); @@ -205,7 +204,7 @@ ConstructTupleDescriptor(Relation heapRelation, ObjectIdGetDatum(keyType), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "Type %u does not exist", keyType); + elog(ERROR, "cache lookup failed for type %u", keyType); typeTup = (Form_pg_type) GETSTRUCT(tuple); /* @@ -239,7 +238,8 @@ ConstructTupleDescriptor(Relation heapRelation, ObjectIdGetDatum(classObjectId[i]), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "Opclass %u does not exist", classObjectId[i]); + elog(ERROR, "cache lookup failed for opclass %u", + classObjectId[i]); keyType = ((Form_pg_opclass) GETSTRUCT(tuple))->opckeytype; ReleaseSysCache(tuple); @@ -250,7 +250,7 @@ ConstructTupleDescriptor(Relation heapRelation, ObjectIdGetDatum(keyType), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "Type %u does not exist", keyType); + elog(ERROR, "cache lookup failed for type %u", keyType); typeTup = (Form_pg_type) GETSTRUCT(tuple); to->atttypid = keyType; @@ -520,7 +520,9 @@ index_create(Oid heapRelationId, if (!allow_system_table_mods && IsSystemRelation(heapRelation) && IsNormalProcessingMode()) - elog(ERROR, "User-defined indexes on system catalogs are not supported"); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("user-defined indexes on system catalogs are not supported"))); /* * We cannot allow indexing a shared relation after initdb (because @@ -530,11 +532,15 @@ index_create(Oid heapRelationId, * under normal multi-user operation. */ if (shared_relation && IsUnderPostmaster) - elog(ERROR, "Shared indexes cannot be created after initdb"); + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("shared indexes cannot be created after initdb"))); if (get_relname_relid(indexRelationName, namespaceId)) - elog(ERROR, "relation named \"%s\" already exists", - indexRelationName); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_TABLE), + errmsg("relation \"%s\" already exists", + indexRelationName))); /* * construct tuple descriptor for index tuples @@ -639,7 +645,7 @@ index_create(Oid heapRelationId, constraintType = CONSTRAINT_UNIQUE; else { - elog(ERROR, "index_create: constraint must be PRIMARY or UNIQUE"); + elog(ERROR, "constraint must be PRIMARY or UNIQUE"); constraintType = 0; /* keep compiler quiet */ } @@ -807,8 +813,7 @@ index_drop(Oid indexId) ObjectIdGetDatum(indexId), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "index_drop: cache lookup failed for index %u", - indexId); + elog(ERROR, "cache lookup failed for index %u", indexId); simple_heap_delete(indexRelation, &tuple->t_self); @@ -820,7 +825,7 @@ index_drop(Oid indexId) */ i = FlushRelationBuffers(userIndexRelation, (BlockNumber) 0); if (i < 0) - elog(ERROR, "index_drop: FlushRelationBuffers returned %d", i); + elog(ERROR, "FlushRelationBuffers returned %d", i); smgrunlink(DEFAULT_SMGR, userIndexRelation); @@ -984,8 +989,10 @@ IndexesAreActive(Relation heaprel) if (heaprel->rd_rel->relkind != RELKIND_RELATION && heaprel->rd_rel->relkind != RELKIND_TOASTVALUE) - elog(ERROR, "relation %s isn't an indexable relation", - RelationGetRelationName(heaprel)); + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("relation \"%s\" isn't an indexable relation", + RelationGetRelationName(heaprel)))); /* If pg_class.relhasindex is set, indexes are active */ isactive = heaprel->rd_rel->relhasindex; @@ -1055,8 +1062,7 @@ setRelhasindex(Oid relid, bool hasindex, bool isprimary, Oid reltoastidxid) } if (!HeapTupleIsValid(tuple)) - elog(ERROR, "setRelhasindex: cannot find relation %u in pg_class", - relid); + elog(ERROR, "could not find tuple for relation %u", relid); /* * Update fields in the pg_class tuple. @@ -1171,7 +1177,7 @@ setNewRelfilenode(Relation relation) } if (!HeapTupleIsValid(tuple)) - elog(ERROR, "setNewRelfilenode: cannot find relation %u in pg_class", + elog(ERROR, "could not find tuple for relation %u", RelationGetRelid(relation)); rd_rel = (Form_pg_class) GETSTRUCT(tuple); @@ -1283,8 +1289,7 @@ UpdateStats(Oid relid, double reltuples) } if (!HeapTupleIsValid(tuple)) - elog(ERROR, "UpdateStats: cannot find relation %u in pg_class", - relid); + elog(ERROR, "could not find tuple for relation %u", relid); /* * Figure values to insert. @@ -1558,7 +1563,7 @@ IndexBuildHeapScan(Relation heapRelation, */ if (!TransactionIdIsCurrentTransactionId( HeapTupleHeaderGetXmin(heapTuple->t_data))) - elog(ERROR, "IndexBuildHeapScan: concurrent insert in progress"); + elog(ERROR, "concurrent insert in progress"); indexIt = true; tupleIsAlive = true; break; @@ -1573,12 +1578,12 @@ IndexBuildHeapScan(Relation heapRelation, */ if (!TransactionIdIsCurrentTransactionId( HeapTupleHeaderGetXmax(heapTuple->t_data))) - elog(ERROR, "IndexBuildHeapScan: concurrent delete in progress"); + elog(ERROR, "concurrent delete in progress"); indexIt = true; tupleIsAlive = false; break; default: - elog(ERROR, "Unexpected HeapTupleSatisfiesVacuum result"); + elog(ERROR, "unexpected HeapTupleSatisfiesVacuum result"); indexIt = tupleIsAlive = false; /* keep compiler quiet */ break; } @@ -1673,8 +1678,7 @@ IndexGetRelation(Oid indexId) ObjectIdGetDatum(indexId), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "IndexGetRelation: can't find index id %u", - indexId); + elog(ERROR, "cache lookup failed for index %u", indexId); index = (Form_pg_index) GETSTRUCT(tuple); Assert(index->indexrelid == indexId); @@ -1721,8 +1725,6 @@ reindex_index(Oid indexId, bool force, bool inplace) * index is locked down. */ iRel = index_open(indexId); - if (iRel == NULL) - elog(ERROR, "reindex_index: can't open index relation"); LockRelation(iRel, AccessExclusiveLock); old = SetReindexProcessing(true); @@ -1732,8 +1734,6 @@ reindex_index(Oid indexId, bool force, bool inplace) /* Open the parent heap relation */ heapRelation = heap_open(heapId, AccessExclusiveLock); - if (heapRelation == NULL) - elog(ERROR, "reindex_index: can't open heap relation"); /* * If it's a shared index, we must do inplace processing (because we @@ -1747,13 +1747,17 @@ reindex_index(Oid indexId, bool force, bool inplace) if (iRel->rd_rel->relisshared) { if (!IsIgnoringSystemIndexes()) - elog(ERROR, "the target relation %u is shared", indexId); + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("the target relation %u is shared", indexId))); inplace = true; } if (iRel->rd_isnailed) { if (!IsIgnoringSystemIndexes()) - elog(ERROR, "the target relation %u is nailed", indexId); + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("the target relation %u is nailed", indexId))); inplace = true; } @@ -1870,7 +1874,9 @@ reindex_relation(Oid relid, bool force) deactivate_needed = true; } else - elog(ERROR, "the target relation %u is shared", relid); + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("the target relation %u is shared", relid))); } old = SetReindexProcessing(true); diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index a76e8a23ff..df1e53b6f0 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -13,7 +13,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/namespace.c,v 1.53 2003/06/27 17:03:29 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/namespace.c,v 1.54 2003/07/21 01:59:09 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -162,7 +162,9 @@ RangeVarGetRelid(const RangeVar *relation, bool failOK) if (relation->catalogname) { if (strcmp(relation->catalogname, get_database_name(MyDatabaseId)) != 0) - elog(ERROR, "Cross-database references are not implemented"); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cross-database references are not implemented"))); } if (relation->schemaname) @@ -180,11 +182,15 @@ RangeVarGetRelid(const RangeVar *relation, bool failOK) if (!OidIsValid(relId) && !failOK) { if (relation->schemaname) - elog(ERROR, "Relation \"%s\".\"%s\" does not exist", - relation->schemaname, relation->relname); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_TABLE), + errmsg("relation \"%s.%s\" does not exist", + relation->schemaname, relation->relname))); else - elog(ERROR, "Relation \"%s\" does not exist", - relation->relname); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_TABLE), + errmsg("relation \"%s\" does not exist", + relation->relname))); } return relId; } @@ -209,14 +215,18 @@ RangeVarGetCreationNamespace(const RangeVar *newRelation) if (newRelation->catalogname) { if (strcmp(newRelation->catalogname, get_database_name(MyDatabaseId)) != 0) - elog(ERROR, "Cross-database references are not implemented"); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cross-database references are not implemented"))); } if (newRelation->istemp) { /* TEMP tables are created in our backend-local temp namespace */ if (newRelation->schemaname) - elog(ERROR, "TEMP tables may not specify a namespace"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("TEMP tables may not specify a schema name"))); /* Initialize temp namespace if first time through */ if (!OidIsValid(myTempNamespace)) InitTempTableNamespace(); @@ -230,8 +240,10 @@ RangeVarGetCreationNamespace(const RangeVar *newRelation) CStringGetDatum(newRelation->schemaname), 0, 0, 0); if (!OidIsValid(namespaceId)) - elog(ERROR, "Namespace \"%s\" does not exist", - newRelation->schemaname); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("schema \"%s\" does not exist", + newRelation->schemaname))); /* we do not check for USAGE rights here! */ } else @@ -240,7 +252,9 @@ RangeVarGetCreationNamespace(const RangeVar *newRelation) recomputeNamespacePath(); namespaceId = defaultCreationNamespace; if (!OidIsValid(namespaceId)) - elog(ERROR, "No namespace has been selected to create in"); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("no schema has been selected to create in"))); } /* Note: callers will check for CREATE rights when appropriate */ @@ -293,7 +307,7 @@ RelationIsVisible(Oid relid) ObjectIdGetDatum(relid), 0, 0, 0); if (!HeapTupleIsValid(reltup)) - elog(ERROR, "Cache lookup failed for relation %u", relid); + elog(ERROR, "cache lookup failed for relation %u", relid); relform = (Form_pg_class) GETSTRUCT(reltup); recomputeNamespacePath(); @@ -375,7 +389,7 @@ TypeIsVisible(Oid typid) ObjectIdGetDatum(typid), 0, 0, 0); if (!HeapTupleIsValid(typtup)) - elog(ERROR, "Cache lookup failed for type %u", typid); + elog(ERROR, "cache lookup failed for type %u", typid); typform = (Form_pg_type) GETSTRUCT(typtup); recomputeNamespacePath(); @@ -576,7 +590,7 @@ FunctionIsVisible(Oid funcid) ObjectIdGetDatum(funcid), 0, 0, 0); if (!HeapTupleIsValid(proctup)) - elog(ERROR, "Cache lookup failed for procedure %u", funcid); + elog(ERROR, "cache lookup failed for function %u", funcid); procform = (Form_pg_proc) GETSTRUCT(proctup); recomputeNamespacePath(); @@ -788,7 +802,7 @@ OperatorIsVisible(Oid oprid) ObjectIdGetDatum(oprid), 0, 0, 0); if (!HeapTupleIsValid(oprtup)) - elog(ERROR, "Cache lookup failed for operator %u", oprid); + elog(ERROR, "cache lookup failed for operator %u", oprid); oprform = (Form_pg_operator) GETSTRUCT(oprtup); recomputeNamespacePath(); @@ -1001,7 +1015,7 @@ OpclassIsVisible(Oid opcid) ObjectIdGetDatum(opcid), 0, 0, 0); if (!HeapTupleIsValid(opctup)) - elog(ERROR, "Cache lookup failed for opclass %u", opcid); + elog(ERROR, "cache lookup failed for opclass %u", opcid); opcform = (Form_pg_opclass) GETSTRUCT(opctup); recomputeNamespacePath(); @@ -1082,7 +1096,7 @@ ConversionIsVisible(Oid conid) ObjectIdGetDatum(conid), 0, 0, 0); if (!HeapTupleIsValid(contup)) - elog(ERROR, "Cache lookup failed for conversion %u", conid); + elog(ERROR, "cache lookup failed for conversion %u", conid); conform = (Form_pg_conversion) GETSTRUCT(contup); recomputeNamespacePath(); @@ -1148,11 +1162,15 @@ DeconstructQualifiedName(List *names, * We check the catalog name and then ignore it. */ if (strcmp(catalogname, get_database_name(MyDatabaseId)) != 0) - elog(ERROR, "Cross-database references are not implemented"); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cross-database references are not implemented"))); break; default: - elog(ERROR, "Improper qualified name (too many dotted names): %s", - NameListToString(names)); + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("improper qualified name (too many dotted names): %s", + NameListToString(names)))); break; } @@ -1165,7 +1183,7 @@ DeconstructQualifiedName(List *names, * Process an explicitly-specified schema name: look up the schema * and verify we have USAGE (lookup) rights in it. * - * Returns the namespace OID. Raises elog if any problem. + * Returns the namespace OID. Raises ereport if any problem. */ Oid LookupExplicitNamespace(const char *nspname) @@ -1177,7 +1195,9 @@ LookupExplicitNamespace(const char *nspname) CStringGetDatum(nspname), 0, 0, 0); if (!OidIsValid(namespaceId)) - elog(ERROR, "Namespace \"%s\" does not exist", nspname); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("schema \"%s\" does not exist", nspname))); aclresult = pg_namespace_aclcheck(namespaceId, GetUserId(), ACL_USAGE); if (aclresult != ACLCHECK_OK) @@ -1212,8 +1232,9 @@ QualifiedNameGetCreationNamespace(List *names, char **objname_p) CStringGetDatum(schemaname), 0, 0, 0); if (!OidIsValid(namespaceId)) - elog(ERROR, "Namespace \"%s\" does not exist", - schemaname); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("schema \"%s\" does not exist", schemaname))); /* we do not check for USAGE rights here! */ } else @@ -1222,7 +1243,9 @@ QualifiedNameGetCreationNamespace(List *names, char **objname_p) recomputeNamespacePath(); namespaceId = defaultCreationNamespace; if (!OidIsValid(namespaceId)) - elog(ERROR, "No namespace has been selected to create in"); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("no schema has been selected to create in"))); } /* Note: callers will check for CREATE rights when appropriate */ @@ -1255,7 +1278,10 @@ makeRangeVarFromNameList(List *names) rel->relname = strVal(lthird(names)); break; default: - elog(ERROR, "Improper relation name (too many dotted names)"); + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("improper relation name (too many dotted names): %s", + NameListToString(names)))); break; } @@ -1467,7 +1493,7 @@ recomputeNamespacePath(void) { /* syntax error in name list */ /* this should not happen if GUC checked check_search_path */ - elog(ERROR, "recomputeNamespacePath: invalid list syntax"); + elog(ERROR, "invalid list syntax"); } /* @@ -1596,8 +1622,10 @@ InitTempTableNamespace(void) */ if (pg_database_aclcheck(MyDatabaseId, GetSessionUserId(), ACL_CREATE_TEMP) != ACLCHECK_OK) - elog(ERROR, "%s: not authorized to create temp tables", - get_database_name(MyDatabaseId)); + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("not authorized to create temp tables in database \"%s\"", + get_database_name(MyDatabaseId)))); snprintf(namespaceName, sizeof(namespaceName), "pg_temp_%d", MyBackendId); @@ -1766,7 +1794,9 @@ assign_search_path(const char *newval, bool doit, bool interactive) if (!SearchSysCacheExists(NAMESPACENAME, CStringGetDatum(curname), 0, 0, 0)) - elog(ERROR, "Namespace \"%s\" does not exist", curname); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("schema \"%s\" does not exist", curname))); } } diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c index 678931ce97..6837f3b922 100644 --- a/src/backend/catalog/pg_aggregate.c +++ b/src/backend/catalog/pg_aggregate.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.60 2003/07/04 02:51:33 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.61 2003/07/21 01:59:10 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -62,7 +62,7 @@ AggregateCreate(const char *aggName, ObjectAddress myself, referenced; - /* sanity checks */ + /* sanity checks (caller should have caught these) */ if (!aggName) elog(ERROR, "no aggregate name supplied"); @@ -75,8 +75,11 @@ AggregateCreate(const char *aggName, */ if ((aggTransType == ANYARRAYOID || aggTransType == ANYELEMENTOID) && !(aggBaseType == ANYARRAYOID || aggBaseType == ANYELEMENTOID)) - elog(ERROR, "an aggregate using ANYARRAY or ANYELEMENT as trans type " - "must also have one of them as its base type"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("cannot determine transition datatype"), + errdetail("An aggregate using ANYARRAY or ANYELEMENT as " + "trans type must have one of them as its base type."))); /* handle transfn */ MemSet(fnArgs, 0, FUNC_MAX_ARGS * sizeof(Oid)); @@ -102,14 +105,17 @@ AggregateCreate(const char *aggName, * polymorphic we *must* demand exact equality. */ if (rettype != aggTransType) - elog(ERROR, "return type of transition function %s is not %s", - NameListToString(aggtransfnName), format_type_be(aggTransType)); + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("return type of transition function %s is not %s", + NameListToString(aggtransfnName), + format_type_be(aggTransType)))); tup = SearchSysCache(PROCOID, ObjectIdGetDatum(transfn), 0, 0, 0); if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup of function %u failed", transfn); + elog(ERROR, "cache lookup failed for function %u", transfn); proc = (Form_pg_proc) GETSTRUCT(tup); /* @@ -121,7 +127,9 @@ AggregateCreate(const char *aggName, if (proc->proisstrict && agginitval == NULL) { if (!IsBinaryCoercible(aggBaseType, aggTransType)) - elog(ERROR, "must not omit initval when transfn is strict and transtype is not compatible with input type"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("must not omit initval when transfn is strict and transtype is not compatible with input type"))); } ReleaseSysCache(tup); @@ -152,8 +160,11 @@ AggregateCreate(const char *aggName, */ if ((finaltype == ANYARRAYOID || finaltype == ANYELEMENTOID) && !(aggBaseType == ANYARRAYOID || aggBaseType == ANYELEMENTOID)) - elog(ERROR, "an aggregate returning ANYARRAY or ANYELEMENT " - "must also have one of them as its base type"); + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("cannot determine result datatype"), + errdetail("An aggregate returning ANYARRAY or ANYELEMENT " + "must have one of them as its base type."))); /* * Everything looks okay. Try to create the pg_proc entry for the @@ -264,11 +275,15 @@ lookup_agg_function(List *fnName, /* only valid case is a normal function not returning a set */ if (fdresult != FUNCDETAIL_NORMAL || !OidIsValid(fnOid)) - elog(ERROR, "function %s does not exist", - func_signature_string(fnName, nargs, input_types)); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_FUNCTION), + errmsg("function %s does not exist", + func_signature_string(fnName, nargs, input_types)))); if (retset) - elog(ERROR, "function %s returns a set", - func_signature_string(fnName, nargs, input_types)); + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("function %s returns a set", + func_signature_string(fnName, nargs, input_types)))); /* * If the given type(s) are all polymorphic, there's nothing we @@ -296,15 +311,19 @@ lookup_agg_function(List *fnName, if (true_oid_array[0] != ANYARRAYOID && true_oid_array[0] != ANYELEMENTOID && !IsBinaryCoercible(input_types[0], true_oid_array[0])) - elog(ERROR, "function %s requires run-time type coercion", - func_signature_string(fnName, nargs, true_oid_array)); + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("function %s requires run-time type coercion", + func_signature_string(fnName, nargs, true_oid_array)))); if (nargs == 2 && true_oid_array[1] != ANYARRAYOID && true_oid_array[1] != ANYELEMENTOID && !IsBinaryCoercible(input_types[1], true_oid_array[1])) - elog(ERROR, "function %s requires run-time type coercion", - func_signature_string(fnName, nargs, true_oid_array)); + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("function %s requires run-time type coercion", + func_signature_string(fnName, nargs, true_oid_array)))); return fnOid; } diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c index 3822059dd3..89adeb57b9 100644 --- a/src/backend/catalog/pg_constraint.c +++ b/src/backend/catalog/pg_constraint.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_constraint.c,v 1.13 2003/05/28 16:03:56 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_constraint.c,v 1.14 2003/07/21 01:59:10 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -427,8 +427,7 @@ RemoveConstraintById(Oid conId) tup = systable_getnext(conscan); if (!HeapTupleIsValid(tup)) - elog(ERROR, "RemoveConstraintById: constraint %u not found", - conId); + elog(ERROR, "could not find tuple for constraint %u", conId); con = (Form_pg_constraint) GETSTRUCT(tup); /* @@ -460,12 +459,12 @@ RemoveConstraintById(Oid conId) ObjectIdGetDatum(con->conrelid), 0, 0, 0); if (!HeapTupleIsValid(relTup)) - elog(ERROR, "cache lookup of relation %u failed", + elog(ERROR, "cache lookup failed for relation %u", con->conrelid); classForm = (Form_pg_class) GETSTRUCT(relTup); - if (classForm->relchecks == 0) - elog(ERROR, "RemoveConstraintById: relation %s has relchecks = 0", + if (classForm->relchecks == 0) /* should not happen */ + elog(ERROR, "relation \"%s\" has relchecks = 0", RelationGetRelationName(rel)); classForm->relchecks--; @@ -492,8 +491,7 @@ RemoveConstraintById(Oid conId) } else { - elog(ERROR, "RemoveConstraintById: Constraint %u is not a known type", - conId); + elog(ERROR, "constraint %u is not of a known type", conId); } /* Fry the constraint itself */ diff --git a/src/backend/catalog/pg_conversion.c b/src/backend/catalog/pg_conversion.c index 917d265691..41d097d56b 100644 --- a/src/backend/catalog/pg_conversion.c +++ b/src/backend/catalog/pg_conversion.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_conversion.c,v 1.10 2003/01/27 00:45:19 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_conversion.c,v 1.11 2003/07/21 01:59:10 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -61,7 +61,9 @@ ConversionCreate(const char *conname, Oid connamespace, PointerGetDatum(conname), ObjectIdGetDatum(connamespace), 0, 0)) - elog(ERROR, "conversion name \"%s\" already exists", conname); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("conversion \"%s\" already exists", conname))); if (def) { @@ -72,9 +74,11 @@ ConversionCreate(const char *conname, Oid connamespace, if (FindDefaultConversion(connamespace, conforencoding, contoencoding)) - elog(ERROR, "default conversion for %s to %s already exists", - pg_encoding_to_char(conforencoding), - pg_encoding_to_char(contoencoding)); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("default conversion for \"%s\" to \"%s\" already exists", + pg_encoding_to_char(conforencoding), + pg_encoding_to_char(contoencoding)))); } /* open pg_conversion */ @@ -138,12 +142,13 @@ ConversionDrop(Oid conversionOid, DropBehavior behavior) ObjectIdGetDatum(conversionOid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "Conversion %u search from syscache failed", - conversionOid); + elog(ERROR, "cache lookup failed for conversion %u", conversionOid); if (!superuser() && ((Form_pg_conversion) GETSTRUCT(tuple))->conowner != GetUserId()) - elog(ERROR, "DROP CONVERSION: permission denied"); + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission denied"))); ReleaseSysCache(tuple); @@ -189,7 +194,7 @@ RemoveConversionById(Oid conversionOid) if (HeapTupleIsValid(tuple = heap_getnext(scan, ForwardScanDirection))) simple_heap_delete(rel, &tuple->t_self); else - elog(ERROR, "conversion %u does not exist", conversionOid); + elog(ERROR, "could not find tuple for conversion %u", conversionOid); heap_endscan(scan); heap_close(rel, RowExclusiveLock); } @@ -299,13 +304,16 @@ pg_convert_using(PG_FUNCTION_ARGS) parsed_name = textToQualifiedNameList(conv_name, "convert_using"); convoid = FindConversionByName(parsed_name); if (!OidIsValid(convoid)) - elog(ERROR, "conversion %s not found", NameListToString(parsed_name)); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("conversion \"%s\" does not exist", + NameListToString(parsed_name)))); tuple = SearchSysCache(CONOID, ObjectIdGetDatum(convoid), 0, 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "Conversion %u search from syscache failed", convoid); + elog(ERROR, "cache lookup failed for conversion %u", convoid); body = (Form_pg_conversion) GETSTRUCT(tuple); /* Temporary result area should be more than big enough */ diff --git a/src/backend/catalog/pg_largeobject.c b/src/backend/catalog/pg_largeobject.c index 07d5dca731..ecc510e07d 100644 --- a/src/backend/catalog/pg_largeobject.c +++ b/src/backend/catalog/pg_largeobject.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_largeobject.c,v 1.14 2002/08/05 03:29:16 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_largeobject.c,v 1.15 2003/07/21 01:59:10 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -105,7 +105,9 @@ LargeObjectDrop(Oid loid) heap_close(pg_largeobject, RowShareLock); if (!found) - elog(ERROR, "LargeObjectDrop: large object %u not found", loid); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("large object %u does not exist", loid))); } bool diff --git a/src/backend/catalog/pg_namespace.c b/src/backend/catalog/pg_namespace.c index 0831ea61e2..b8cf8bf945 100644 --- a/src/backend/catalog/pg_namespace.c +++ b/src/backend/catalog/pg_namespace.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_namespace.c,v 1.5 2002/08/05 03:29:16 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_namespace.c,v 1.6 2003/07/21 01:59:10 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -46,7 +46,9 @@ NamespaceCreate(const char *nspName, int32 ownerSysId) if (SearchSysCacheExists(NAMESPACENAME, PointerGetDatum(nspName), 0, 0, 0)) - elog(ERROR, "namespace \"%s\" already exists", nspName); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_SCHEMA), + errmsg("schema \"%s\" already exists", nspName))); /* initialize nulls and values */ for (i = 0; i < Natts_pg_namespace; i++) diff --git a/src/backend/catalog/pg_operator.c b/src/backend/catalog/pg_operator.c index 023f7ef280..2af44c01f7 100644 --- a/src/backend/catalog/pg_operator.c +++ b/src/backend/catalog/pg_operator.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.79 2003/07/04 02:51:33 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.80 2003/07/21 01:59:11 tgl Exp $ * * NOTES * these routines moved here from commands/define.c and somewhat cleaned up. @@ -80,7 +80,7 @@ validOperatorName(const char *name) /* Can't contain any invalid characters */ /* Test string here should match op_chars in scan.l */ - if (strspn(name, "~!@#^&|`?$+-*/%<>=") != len) + if (strspn(name, "~!@#^&|`?+-*/%<>=") != len) return false; /* Can't contain slash-star or dash-dash (comment starts) */ @@ -102,7 +102,7 @@ validOperatorName(const char *name) for (ic = len - 2; ic >= 0; ic--) { - if (strchr("~!@#^&|`?$%", name[ic])) + if (strchr("~!@#^&|`?%", name[ic])) break; } if (ic < 0) @@ -212,7 +212,10 @@ OperatorShellMake(const char *operatorName, * validate operator name */ if (!validOperatorName(operatorName)) - elog(ERROR, "\"%s\" is not a valid operator name", operatorName); + ereport(ERROR, + (errcode(ERRCODE_INVALID_NAME), + errmsg("\"%s\" is not a valid operator name", + operatorName))); /* * initialize our *nulls and *values arrays @@ -398,22 +401,35 @@ OperatorCreate(const char *operatorName, * Sanity checks */ if (!validOperatorName(operatorName)) - elog(ERROR, "\"%s\" is not a valid operator name", operatorName); + ereport(ERROR, + (errcode(ERRCODE_INVALID_NAME), + errmsg("\"%s\" is not a valid operator name", + operatorName))); if (!OidIsValid(leftTypeId) && !OidIsValid(rightTypeId)) - elog(ERROR, "at least one of leftarg or rightarg must be specified"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("at least one of leftarg or rightarg must be specified"))); if (!(OidIsValid(leftTypeId) && OidIsValid(rightTypeId))) { /* If it's not a binary op, these things mustn't be set: */ if (commutatorName) - elog(ERROR, "only binary operators can have commutators"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only binary operators can have commutators"))); if (joinName) - elog(ERROR, "only binary operators can have join selectivity"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only binary operators can have join selectivity"))); if (canHash) - elog(ERROR, "only binary operators can hash"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only binary operators can hash"))); if (leftSortName || rightSortName || ltCompareName || gtCompareName) - elog(ERROR, "only binary operators can mergejoin"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only binary operators can mergejoin"))); } operatorObjectId = OperatorGet(operatorName, @@ -423,8 +439,10 @@ OperatorCreate(const char *operatorName, &operatorAlreadyDefined); if (operatorAlreadyDefined) - elog(ERROR, "OperatorDef: operator \"%s\" already defined", - operatorName); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_FUNCTION), + errmsg("operator %s already exists", + operatorName))); /* * At this point, if operatorObjectId is not InvalidOid then we are @@ -615,7 +633,7 @@ OperatorCreate(const char *operatorName, ObjectIdGetDatum(operatorObjectId), 0, 0, 0); if (!HeapTupleIsValid(tup)) - elog(ERROR, "OperatorDef: operator %u not found", + elog(ERROR, "cache lookup failed for operator %u", operatorObjectId); tup = heap_modifytuple(tup, @@ -703,7 +721,9 @@ get_other_operator(List *otherOp, Oid otherLeftTypeId, Oid otherRightTypeId, * only self-linkage for commutation makes sense. */ if (!isCommutator) - elog(ERROR, "operator cannot be its own negator or sort operator"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("operator cannot be its own negator or sort operator"))); return InvalidOid; } @@ -718,10 +738,6 @@ get_other_operator(List *otherOp, Oid otherLeftTypeId, Oid otherRightTypeId, otherNamespace, otherLeftTypeId, otherRightTypeId); - if (!OidIsValid(other_oid)) - elog(ERROR, - "OperatorDef: can't create operator shell \"%s\"", - NameListToString(otherOp)); return other_oid; } diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c index c2d3eb7ca1..60fc4505a9 100644 --- a/src/backend/catalog/pg_proc.c +++ b/src/backend/catalog/pg_proc.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.100 2003/07/18 23:20:32 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.101 2003/07/21 01:59:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -108,7 +108,8 @@ ProcedureCreate(const char *procedureName, if (!genericParam) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("functions returning ANYARRAY or ANYELEMENT must have at least one argument of either type"))); + errmsg("cannot determine result datatype"), + errdetail("A function returning ANYARRAY or ANYELEMENT must have at least one argument of either type."))); } /* Make sure we have a zero-padded param type array */ @@ -532,7 +533,8 @@ check_sql_fn_retval(Oid rettype, char fn_typtype, List *queryTreeList) /* This should already have been caught ... */ ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("functions returning ANYARRAY or ANYELEMENT must have at least one argument of either type"))); + errmsg("cannot determine result datatype"), + errdetail("A function returning ANYARRAY or ANYELEMENT must have at least one argument of either type."))); } else ereport(ERROR, diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c index 90ad20f2d5..7980e6afad 100644 --- a/src/backend/catalog/pg_type.c +++ b/src/backend/catalog/pg_type.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.87 2003/05/08 22:19:56 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.88 2003/07/21 01:59:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -190,16 +190,22 @@ TypeCreate(const char *typeName, if (!(internalSize > 0 || internalSize == -1 || internalSize == -2)) - elog(ERROR, "TypeCreate: invalid type internal size %d", - internalSize); + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("invalid type internal size %d", + internalSize))); if (passedByValue && (internalSize <= 0 || internalSize > (int16) sizeof(Datum))) - elog(ERROR, "TypeCreate: invalid type internal size %d", - internalSize); + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("invalid type internal size %d", + internalSize))); /* Only varlena types can be toasted */ if (storage != 'p' && internalSize != -1) - elog(ERROR, "TypeCreate: fixed size types must have storage PLAIN"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("fixed-size types must have storage PLAIN"))); /* * initialize arrays needed for heap_formtuple or heap_modifytuple @@ -278,7 +284,9 @@ TypeCreate(const char *typeName, */ if (((Form_pg_type) GETSTRUCT(tup))->typisdefined || assignedTypeOid != InvalidOid) - elog(ERROR, "type %s already exists", typeName); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("type \"%s\" already exists", typeName))); /* * Okay to update existing "shell" type tuple @@ -489,13 +497,17 @@ TypeRename(const char *oldTypeName, Oid typeNamespace, ObjectIdGetDatum(typeNamespace), 0, 0); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "type %s does not exist", oldTypeName); + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("type \"%s\" does not exist", oldTypeName))); if (SearchSysCacheExists(TYPENAMENSP, CStringGetDatum(newTypeName), ObjectIdGetDatum(typeNamespace), 0, 0)) - elog(ERROR, "type named %s already exists", newTypeName); + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("type \"%s\" already exists", newTypeName))); namestrcpy(&(((Form_pg_type) GETSTRUCT(tuple))->typname), newTypeName); diff --git a/src/include/utils/acl.h b/src/include/utils/acl.h index 7decac38fd..ed0d4ec703 100644 --- a/src/include/utils/acl.h +++ b/src/include/utils/acl.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: acl.h,v 1.56 2003/06/27 14:45:32 petere Exp $ + * $Id: acl.h,v 1.57 2003/07/21 01:59:11 tgl Exp $ * * NOTES * For backward-compatibility purposes we have to allow there @@ -207,7 +207,7 @@ extern AclResult pg_proc_aclcheck(Oid proc_oid, AclId userid, AclMode mode); extern AclResult pg_language_aclcheck(Oid lang_oid, AclId userid, AclMode mode); extern AclResult pg_namespace_aclcheck(Oid nsp_oid, AclId userid, AclMode mode); -extern void aclcheck_error(AclResult errcode, const char *objectname); +extern void aclcheck_error(AclResult aclerr, const char *objectname); /* ownercheck routines just return true (owner) or false (not) */ extern bool pg_class_ownercheck(Oid class_oid, AclId userid); diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h index 9e497052d2..74476c77b0 100644 --- a/src/include/utils/elog.h +++ b/src/include/utils/elog.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: elog.h,v 1.50 2003/07/20 21:56:35 tgl Exp $ + * $Id: elog.h,v 1.51 2003/07/21 01:59:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -83,7 +83,8 @@ #define ERRCODE_WARNING_NULL_VALUE_ELIMINATED_IN_SET_FUNCTION MAKE_SQLSTATE('0','1', '0','0','3') #define ERRCODE_WARNING_STRING_DATA_RIGHT_TRUNCATION MAKE_SQLSTATE('0','1', '0','0','4') -/* Class 02 - No Data */ +/* Class 02 - No Data --- this is also a warning class per SQL99 */ +/* (do not use this class for failure conditions!) */ #define ERRCODE_NO_DATA MAKE_SQLSTATE('0','2', '0','0','0') #define ERRCODE_NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED MAKE_SQLSTATE('0','2', '0','0','1') @@ -111,6 +112,7 @@ /* Class 0L - Invalid Grantor */ #define ERRCODE_INVALID_GRANTOR MAKE_SQLSTATE('0','L', '0','0','0') +#define ERRCODE_INVALID_GRANT_OPERATION MAKE_SQLSTATE('0','L', 'P','0','1') /* Class 0P - Invalid Role Specification */ #define ERRCODE_INVALID_ROLE_SPECIFICATION MAKE_SQLSTATE('0','P', '0','0','0') @@ -186,6 +188,7 @@ /* Class 2B - Dependent Privilege Descriptors Still Exist */ #define ERRCODE_DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST MAKE_SQLSTATE('2','B', '0','0','0') +#define ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST MAKE_SQLSTATE('2','B', 'P','0','1') /* Class 2D - Invalid Transaction Termination */ #define ERRCODE_INVALID_TRANSACTION_TERMINATION MAKE_SQLSTATE('2','D', '0','0','0') diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 234a393754..7ade401290 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -358,8 +358,8 @@ NOTICE: ALTER TABLE will create implicit trigger(s) for FOREIGN KEY check(s) ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable(ptest1); NOTICE: ALTER TABLE will create implicit trigger(s) for FOREIGN KEY check(s) DROP TABLE pktable cascade; -NOTICE: Drop cascades to constraint $2 on table fktable -NOTICE: Drop cascades to constraint $1 on table fktable +NOTICE: drop cascades to constraint $2 on table fktable +NOTICE: drop cascades to constraint $1 on table fktable DROP TABLE fktable; CREATE TEMP TABLE PKTABLE (ptest1 int, ptest2 inet, PRIMARY KEY(ptest1, ptest2)); @@ -619,9 +619,9 @@ alter table pg_class alter relname set not null; ERROR: "pg_class" is a system catalog -- try altering non-existent table, should fail alter table non_existent alter column bar set not null; -ERROR: Relation "non_existent" does not exist +ERROR: relation "non_existent" does not exist alter table non_existent alter column bar drop not null; -ERROR: Relation "non_existent" does not exist +ERROR: relation "non_existent" does not exist -- test setting columns to null and not null and vice versa -- test checking for null values and primary key create table atacc1 (test int not null); @@ -744,7 +744,7 @@ alter table pg_class drop column relname; ERROR: "pg_class" is a system catalog -- try altering non-existent table, should fail alter table foo drop column bar; -ERROR: Relation "foo" does not exist +ERROR: relation "foo" does not exist -- test dropping columns create table atacc1 (a int4 not null, b int4, c int4 not null, d int4); insert into atacc1 values (1, 2, 3, 4); @@ -1074,7 +1074,7 @@ alter table c1 drop column f1; select f1 from c1; ERROR: attribute "f1" not found drop table p1 cascade; -NOTICE: Drop cascades to table c1 +NOTICE: drop cascades to table c1 create table p1 (f1 int, f2 int); create table c1 () inherits(p1); -- should be rejected since c1.f1 is inherited @@ -1085,7 +1085,7 @@ alter table p1 drop column f1; select f1 from c1; ERROR: attribute "f1" not found drop table p1 cascade; -NOTICE: Drop cascades to table c1 +NOTICE: drop cascades to table c1 create table p1 (f1 int, f2 int); create table c1 () inherits(p1); -- should be rejected since c1.f1 is inherited @@ -1095,7 +1095,7 @@ alter table only p1 drop column f1; -- c1.f1 is NOT dropped, but must now be considered non-inherited alter table c1 drop column f1; drop table p1 cascade; -NOTICE: Drop cascades to table c1 +NOTICE: drop cascades to table c1 create table p1 (f1 int, f2 int); create table c1 (f1 int not null) inherits(p1); NOTICE: merging attribute "f1" with inherited definition @@ -1106,7 +1106,7 @@ alter table only p1 drop column f1; -- c1.f1 is still there, but no longer inherited alter table c1 drop column f1; drop table p1 cascade; -NOTICE: Drop cascades to table c1 +NOTICE: drop cascades to table c1 create table p1(id int, name text); create table p2(id2 int, name text, height int); create table c1(age int) inherits(p1,p2); @@ -1166,8 +1166,8 @@ order by relname, attnum; (8 rows) drop table p1, p2 cascade; -NOTICE: Drop cascades to table c1 -NOTICE: Drop cascades to table gc1 +NOTICE: drop cascades to table c1 +NOTICE: drop cascades to table gc1 -- -- Test the ALTER TABLE WITHOUT OIDS command -- @@ -1250,8 +1250,8 @@ select * from p1; (2 rows) drop table p1 cascade; -NOTICE: Drop cascades to table c1 -NOTICE: Drop cascades to constraint p1_a1 on table c1 +NOTICE: drop cascades to table c1 +NOTICE: drop cascades to constraint p1_a1 on table c1 -- test that operations with a dropped column do not try to reference -- its datatype create domain mytype as text; @@ -1264,7 +1264,7 @@ select * from foo; (1 row) drop domain mytype cascade; -NOTICE: Drop cascades to table foo column f2 +NOTICE: drop cascades to table foo column f2 select * from foo; f1 | f3 ----+---- diff --git a/src/test/regress/expected/conversion.out b/src/test/regress/expected/conversion.out index 5ec1adf12f..622fccaacd 100644 --- a/src/test/regress/expected/conversion.out +++ b/src/test/regress/expected/conversion.out @@ -8,7 +8,7 @@ CREATE CONVERSION myconv FOR 'LATIN1' TO 'UNICODE' FROM iso8859_1_to_utf8; -- cannot make same name conversion in same schema -- CREATE CONVERSION myconv FOR 'LATIN1' TO 'UNICODE' FROM iso8859_1_to_utf8; -ERROR: conversion name "myconv" already exists +ERROR: conversion "myconv" already exists -- -- create default conversion with qualified name -- @@ -17,7 +17,7 @@ CREATE DEFAULT CONVERSION public.mydef FOR 'LATIN1' TO 'UNICODE' FROM iso8859_1_ -- cannot make default conversion with same shcema/for_encoding/to_encoding -- CREATE DEFAULT CONVERSION public.mydef2 FOR 'LATIN1' TO 'UNICODE' FROM iso8859_1_to_utf8; -ERROR: default conversion for LATIN1 to UNICODE already exists +ERROR: default conversion for "LATIN1" to "UNICODE" already exists -- -- drop user defined conversion -- diff --git a/src/test/regress/expected/create_type.out b/src/test/regress/expected/create_type.out index b70289b9f1..64c29890fd 100644 --- a/src/test/regress/expected/create_type.out +++ b/src/test/regress/expected/create_type.out @@ -72,5 +72,5 @@ SELECT * FROM get_default_test(); (1 row) DROP TYPE default_test_row CASCADE; -NOTICE: Drop cascades to function get_default_test() +NOTICE: drop cascades to function get_default_test() DROP TABLE default_test; diff --git a/src/test/regress/expected/domain.out b/src/test/regress/expected/domain.out index cdc076da7e..68e3e7a963 100644 --- a/src/test/regress/expected/domain.out +++ b/src/test/regress/expected/domain.out @@ -214,8 +214,8 @@ alter domain dnotnulltest drop not null; -- fails NOTICE: "dnotnulltest" is already set to NULL update domnotnull set col1 = null; drop domain dnotnulltest cascade; -NOTICE: Drop cascades to table domnotnull column col2 -NOTICE: Drop cascades to table domnotnull column col1 +NOTICE: drop cascades to table domnotnull column col2 +NOTICE: drop cascades to table domnotnull column col1 -- Test ALTER DOMAIN .. DEFAULT .. create table domdeftest (col1 ddef1); insert into domdeftest default values; diff --git a/src/test/regress/expected/errors.out b/src/test/regress/expected/errors.out index eefdf5f20e..132e2ad709 100644 --- a/src/test/regress/expected/errors.out +++ b/src/test/regress/expected/errors.out @@ -25,7 +25,7 @@ select; ERROR: syntax error at or near ";" at character 7 -- no such relation select * from nonesuch; -ERROR: Relation "nonesuch" does not exist +ERROR: relation "nonesuch" does not exist -- missing target list select from pg_database; ERROR: syntax error at or near "from" at character 8 @@ -52,7 +52,7 @@ delete from; ERROR: syntax error at or near ";" at character 12 -- no such relation delete from nonesuch; -ERROR: Relation "nonesuch" does not exist +ERROR: relation "nonesuch" does not exist -- -- DROP @@ -71,10 +71,10 @@ alter table rename; ERROR: syntax error at or near ";" at character 19 -- no such relation alter table nonesuch rename to newnonesuch; -ERROR: Relation "nonesuch" does not exist +ERROR: relation "nonesuch" does not exist -- no such relation alter table nonesuch rename to stud_emp; -ERROR: Relation "nonesuch" does not exist +ERROR: relation "nonesuch" does not exist -- conflict alter table stud_emp rename to aggtest; ERROR: relation "aggtest" already exists @@ -84,7 +84,7 @@ ERROR: relation "stud_emp" already exists -- attribute renaming -- no such relation alter table nonesuchrel rename column nonesuchatt to newnonesuchatt; -ERROR: Relation "nonesuchrel" does not exist +ERROR: relation "nonesuchrel" does not exist -- no such attribute alter table emp rename column nonesuchatt to newnonesuchatt; ERROR: attribute "nonesuchatt" does not exist @@ -227,7 +227,7 @@ drop rule 314159; ERROR: syntax error at or near "314159" at character 11 -- no such rule drop rule nonesuch on noplace; -ERROR: Relation "noplace" does not exist +ERROR: relation "noplace" does not exist -- bad keyword drop tuple rule nonesuch; ERROR: syntax error at or near "tuple" at character 6 diff --git a/src/test/regress/expected/foreign_key.out b/src/test/regress/expected/foreign_key.out index 9d5c95b6ec..7ac2eb387d 100644 --- a/src/test/regress/expected/foreign_key.out +++ b/src/test/regress/expected/foreign_key.out @@ -138,7 +138,7 @@ SELECT * FROM FKTABLE; (5 rows) DROP TABLE PKTABLE CASCADE; -NOTICE: Drop cascades to constraint constrname on table fktable +NOTICE: drop cascades to constraint constrname on table fktable DROP TABLE FKTABLE; -- -- check set default and table constraint on multiple columns @@ -225,10 +225,10 @@ SELECT * FROM FKTABLE; -- this should fail for lack of CASCADE DROP TABLE PKTABLE; NOTICE: constraint constrname2 on table fktable depends on table pktable -ERROR: Cannot drop table pktable because other objects depend on it - Use DROP ... CASCADE to drop the dependent objects too +ERROR: cannot drop table pktable because other objects depend on it +HINT: Use DROP ... CASCADE to drop the dependent objects too. DROP TABLE PKTABLE CASCADE; -NOTICE: Drop cascades to constraint constrname2 on table fktable +NOTICE: drop cascades to constraint constrname2 on table fktable DROP TABLE FKTABLE; -- -- First test, check with no on delete or on update diff --git a/src/test/regress/expected/polymorphism.out b/src/test/regress/expected/polymorphism.out index 08bed53de7..04b52738e6 100644 --- a/src/test/regress/expected/polymorphism.out +++ b/src/test/regress/expected/polymorphism.out @@ -76,7 +76,8 @@ CREATE AGGREGATE myaggp01a(BASETYPE = "ANY", SFUNC = stfnp, STYPE = int4[], -- should ERROR: stfnp(anyarray) not matched by stfnp(int[]) CREATE AGGREGATE myaggp02a(BASETYPE = "ANY", SFUNC = stfnp, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. -- N P -- should CREATE CREATE AGGREGATE myaggp03a(BASETYPE = "ANY", SFUNC = stfp, STYPE = int4[], @@ -87,10 +88,12 @@ CREATE AGGREGATE myaggp03b(BASETYPE = "ANY", SFUNC = stfp, STYPE = int4[], -- should ERROR: we have no way to resolve S CREATE AGGREGATE myaggp04a(BASETYPE = "ANY", SFUNC = stfp, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. CREATE AGGREGATE myaggp04b(BASETYPE = "ANY", SFUNC = stfp, STYPE = anyarray, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. -- Case2 (R = P) && ((B = P) || (B = N)) -- ------------------------------------- -- S tf1 B tf2 @@ -144,12 +147,14 @@ ERROR: function tfp(integer[], anyelement) does not exist -- should ERROR: tfnp(anyarray, int) not matched by tfnp(int[],int) CREATE AGGREGATE myaggp13a(BASETYPE = int, SFUNC = tfnp, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. -- P N N P -- should ERROR: tf2p(anyarray, int) not matched by tf2p(int[],anyelement) CREATE AGGREGATE myaggp14a(BASETYPE = int, SFUNC = tf2p, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. -- P N P N -- should ERROR: tfnp(anyarray, anyelement) not matched by tfnp(int[],int) CREATE AGGREGATE myaggp15a(BASETYPE = anyelement, SFUNC = tfnp, @@ -164,18 +169,22 @@ ERROR: function tf2p(anyarray, anyelement) does not exist -- should ERROR: we have no way to resolve S CREATE AGGREGATE myaggp17a(BASETYPE = int, SFUNC = tf1p, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. CREATE AGGREGATE myaggp17b(BASETYPE = int, SFUNC = tf1p, STYPE = anyarray, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. -- P P N P -- should ERROR: tfp(anyarray, int) not matched by tfp(anyarray, anyelement) CREATE AGGREGATE myaggp18a(BASETYPE = int, SFUNC = tfp, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. CREATE AGGREGATE myaggp18b(BASETYPE = int, SFUNC = tfp, STYPE = anyarray, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. -- P P P N -- should ERROR: tf1p(anyarray, anyelement) not matched by tf1p(anyarray, int) CREATE AGGREGATE myaggp19a(BASETYPE = anyelement, SFUNC = tf1p, @@ -204,10 +213,12 @@ CREATE AGGREGATE myaggn01b(BASETYPE = "ANY", SFUNC = stfnp, STYPE = int4[], -- should ERROR: stfnp(anyarray) not matched by stfnp(int[]) CREATE AGGREGATE myaggn02a(BASETYPE = "ANY", SFUNC = stfnp, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. CREATE AGGREGATE myaggn02b(BASETYPE = "ANY", SFUNC = stfnp, STYPE = anyarray, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. -- N P -- should CREATE CREATE AGGREGATE myaggn03a(BASETYPE = "ANY", SFUNC = stfp, STYPE = int4[], @@ -216,7 +227,8 @@ CREATE AGGREGATE myaggn03a(BASETYPE = "ANY", SFUNC = stfp, STYPE = int4[], -- should ERROR: ffnp(anyarray) not matched by ffnp(int[]) CREATE AGGREGATE myaggn04a(BASETYPE = "ANY", SFUNC = stfp, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. -- Case4 (R = N) && ((B = P) || (B = N)) -- ------------------------------------- -- S tf1 B tf2 @@ -269,18 +281,22 @@ ERROR: function tfp(integer[], anyelement) does not exist -- should ERROR: tfnp(anyarray, int) not matched by tfnp(int[],int) CREATE AGGREGATE myaggn13a(BASETYPE = int, SFUNC = tfnp, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. CREATE AGGREGATE myaggn13b(BASETYPE = int, SFUNC = tfnp, STYPE = anyarray, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. -- P N N P -- should ERROR: tf2p(anyarray, int) not matched by tf2p(int[],anyelement) CREATE AGGREGATE myaggn14a(BASETYPE = int, SFUNC = tf2p, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. CREATE AGGREGATE myaggn14b(BASETYPE = int, SFUNC = tf2p, STYPE = anyarray, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. -- P N P N -- should ERROR: tfnp(anyarray, anyelement) not matched by tfnp(int[],int) CREATE AGGREGATE myaggn15a(BASETYPE = anyelement, SFUNC = tfnp, @@ -301,12 +317,14 @@ ERROR: function tf2p(anyarray, anyelement) does not exist -- should ERROR: ffnp(anyarray) not matched by ffnp(int[]) CREATE AGGREGATE myaggn17a(BASETYPE = int, SFUNC = tf1p, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. -- P P N P -- should ERROR: tfp(anyarray, int) not matched by tfp(anyarray, anyelement) CREATE AGGREGATE myaggn18a(BASETYPE = int, SFUNC = tfp, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}'); -ERROR: an aggregate using ANYARRAY or ANYELEMENT as trans type must also have one of them as its base type +ERROR: cannot determine transition datatype +DETAIL: An aggregate using ANYARRAY or ANYELEMENT as trans type must have one of them as its base type. -- P P P N -- should ERROR: tf1p(anyarray, anyelement) not matched by tf1p(anyarray, int) CREATE AGGREGATE myaggn19a(BASETYPE = anyelement, SFUNC = tf1p, diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index 99e3e995ae..cc30808652 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -69,11 +69,11 @@ SELECT * FROM atest2; -- ok INSERT INTO atest1 VALUES (2, 'two'); -- ok INSERT INTO atest2 VALUES ('foo', true); -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" INSERT INTO atest1 SELECT 1, b FROM atest1; -- ok UPDATE atest1 SET a = 1 WHERE a = 2; -- ok UPDATE atest2 SET col2 = NOT col2; -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" SELECT * FROM atest1 FOR UPDATE; -- ok a | b ---+----- @@ -82,15 +82,15 @@ SELECT * FROM atest1 FOR UPDATE; -- ok (2 rows) SELECT * FROM atest2 FOR UPDATE; -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" DELETE FROM atest2; -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" COPY atest2 FROM stdin; -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" GRANT ALL ON atest1 TO PUBLIC; -- fail -ERROR: atest1: permission denied +ERROR: permission denied for "atest1" -- checks in subquery, both ok SELECT * FROM atest1 WHERE ( b IN ( SELECT col1 FROM atest2 ) ); a | b @@ -117,33 +117,33 @@ SELECT * FROM atest1; -- ok (2 rows) SELECT * FROM atest2; -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" INSERT INTO atest1 VALUES (2, 'two'); -- fail -ERROR: atest1: permission denied +ERROR: permission denied for "atest1" INSERT INTO atest2 VALUES ('foo', true); -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" INSERT INTO atest1 SELECT 1, b FROM atest1; -- fail -ERROR: atest1: permission denied +ERROR: permission denied for "atest1" UPDATE atest1 SET a = 1 WHERE a = 2; -- fail -ERROR: atest1: permission denied +ERROR: permission denied for "atest1" UPDATE atest2 SET col2 = NULL; -- ok UPDATE atest2 SET col2 = NOT col2; -- fails; requires SELECT on atest2 -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" UPDATE atest2 SET col2 = true WHERE atest1.a = 5; -- ok SELECT * FROM atest1 FOR UPDATE; -- fail -ERROR: atest1: permission denied +ERROR: permission denied for "atest1" SELECT * FROM atest2 FOR UPDATE; -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" DELETE FROM atest2; -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- ok COPY atest2 FROM stdin; -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" -- checks in subquery, both fail SELECT * FROM atest1 WHERE ( b IN ( SELECT col1 FROM atest2 ) ); -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" SELECT * FROM atest2 WHERE ( col1 IN ( SELECT b FROM atest1 ) ); -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" SET SESSION AUTHORIZATION regressuser4; COPY atest2 FROM stdin; -- ok SELECT * FROM atest1; -- ok @@ -159,7 +159,7 @@ CREATE TABLE atest3 (one int, two int, three int); GRANT DELETE ON atest3 TO GROUP regressgroup2; SET SESSION AUTHORIZATION regressuser1; SELECT * FROM atest3; -- fail -ERROR: atest3: permission denied +ERROR: permission denied for "atest3" DELETE FROM atest3; -- ok -- views SET SESSION AUTHORIZATION regressuser3; @@ -175,7 +175,7 @@ SELECT * FROM atestv1; -- ok (2 rows) SELECT * FROM atestv2; -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" GRANT SELECT ON atestv1, atestv3 TO regressuser4; GRANT SELECT ON atestv2 TO regressuser2; SET SESSION AUTHORIZATION regressuser4; @@ -187,7 +187,7 @@ SELECT * FROM atestv1; -- ok (2 rows) SELECT * FROM atestv2; -- fail -ERROR: atestv2: permission denied +ERROR: permission denied for "atestv2" SELECT * FROM atestv3; -- ok one | two | three -----+-----+------- @@ -203,7 +203,7 @@ GRANT SELECT ON atestv4 TO regressuser2; SET SESSION AUTHORIZATION regressuser2; -- Two complex cases: SELECT * FROM atestv3; -- fail -ERROR: atestv3: permission denied +ERROR: permission denied for "atestv3" SELECT * FROM atestv4; -- ok (even though regressuser2 cannot access underlying atestv3) one | two | three -----+-----+------- @@ -216,7 +216,7 @@ SELECT * FROM atest2; -- ok (1 row) SELECT * FROM atestv2; -- fail (even though regressuser2 can access underlying atest2) -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" -- privileges on functions, languages -- switch to superuser \c - @@ -226,13 +226,13 @@ GRANT USAGE ON LANGUAGE c TO PUBLIC; -- fail ERROR: language "c" is not trusted SET SESSION AUTHORIZATION regressuser1; GRANT USAGE ON LANGUAGE sql TO regressuser2; -- fail -ERROR: sql: permission denied +ERROR: permission denied for "sql" CREATE FUNCTION testfunc1(int) RETURNS int AS 'select 2 * $1;' LANGUAGE sql; CREATE FUNCTION testfunc2(int) RETURNS int AS 'select 3 * $1;' LANGUAGE sql; REVOKE ALL ON FUNCTION testfunc1(int), testfunc2(int) FROM PUBLIC; GRANT EXECUTE ON FUNCTION testfunc1(int), testfunc2(int) TO regressuser2; GRANT USAGE ON FUNCTION testfunc1(int) TO regressuser3; -- semantic error -ERROR: invalid privilege type USAGE for function object +ERROR: invalid privilege type USAGE for function GRANT ALL PRIVILEGES ON FUNCTION testfunc1(int) TO regressuser4; GRANT ALL PRIVILEGES ON FUNCTION testfunc_nosuch(int) TO regressuser4; ERROR: function testfunc_nosuch(integer) does not exist @@ -248,12 +248,12 @@ SELECT testfunc1(5), testfunc2(5); -- ok (1 row) CREATE FUNCTION testfunc3(int) RETURNS int AS 'select 2 * $1;' LANGUAGE sql; -- fail -ERROR: sql: permission denied +ERROR: permission denied for "sql" SET SESSION AUTHORIZATION regressuser3; SELECT testfunc1(5); -- fail -ERROR: testfunc1: permission denied +ERROR: permission denied for "testfunc1" SELECT col1 FROM atest2 WHERE col2 = true; -- fail -ERROR: atest2: permission denied +ERROR: permission denied for "atest2" SELECT testfunc4(true); -- ok testfunc4 ----------- @@ -268,7 +268,7 @@ SELECT testfunc1(5); -- ok (1 row) DROP FUNCTION testfunc1(int); -- fail -ERROR: testfunc1: must be owner +ERROR: must be owner of "testfunc1" \c - DROP FUNCTION testfunc1(int); -- ok -- restore to sanity @@ -282,15 +282,15 @@ select has_table_privilege(NULL,'pg_shadow','select'); (1 row) select has_table_privilege('pg_shad','select'); -ERROR: Relation "pg_shad" does not exist +ERROR: relation "pg_shad" does not exist select has_table_privilege('nosuchuser','pg_shadow','select'); ERROR: user "nosuchuser" does not exist select has_table_privilege('pg_shadow','sel'); ERROR: has_table_privilege: invalid privilege type sel select has_table_privilege(-999999,'pg_shadow','update'); -ERROR: pg_class_aclcheck: invalid user id 4293967297 +ERROR: user with ID 4293967297 does not exist select has_table_privilege(1,'rule'); -ERROR: pg_class_aclcheck: relation 1 not found +ERROR: relation with OID 1 does not exist -- superuser \c - select has_table_privilege(current_user,'pg_shadow','select'); @@ -551,7 +551,7 @@ ERROR: grant options can only be granted to individual users SET SESSION AUTHORIZATION regressuser2; GRANT SELECT ON atest4 TO regressuser3; GRANT UPDATE ON atest4 TO regressuser3; -- fail -ERROR: atest4: permission denied +ERROR: permission denied for "atest4" SET SESSION AUTHORIZATION regressuser1; REVOKE SELECT ON atest4 FROM regressuser3; -- does nothing SELECT has_table_privilege('regressuser3', 'atest4', 'SELECT'); -- true @@ -589,8 +589,8 @@ DROP VIEW atestv1; DROP VIEW atestv2; -- this should cascade to drop atestv4 DROP VIEW atestv3 CASCADE; -NOTICE: Drop cascades to rule _RETURN on view atestv4 -NOTICE: Drop cascades to view atestv4 +NOTICE: drop cascades to rule _RETURN on view atestv4 +NOTICE: drop cascades to view atestv4 -- this should complain "does not exist" DROP VIEW atestv4; ERROR: view "atestv4" does not exist diff --git a/src/test/regress/expected/temp.out b/src/test/regress/expected/temp.out index 02acf157d5..f88bfeb641 100644 --- a/src/test/regress/expected/temp.out +++ b/src/test/regress/expected/temp.out @@ -44,7 +44,7 @@ DROP TABLE temptest; CREATE TEMP TABLE temptest(col int); \c regression SELECT * FROM temptest; -ERROR: Relation "temptest" does not exist +ERROR: relation "temptest" does not exist -- Test ON COMMIT DELETE ROWS CREATE TEMP TABLE temptest(col int) ON COMMIT DELETE ROWS; BEGIN; @@ -78,7 +78,7 @@ SELECT * FROM temptest; COMMIT; SELECT * FROM temptest; -ERROR: Relation "temptest" does not exist +ERROR: relation "temptest" does not exist -- ON COMMIT is only allowed for TEMP CREATE TABLE temptest(col int) ON COMMIT DELETE ROWS; ERROR: ON COMMIT can only be used on TEMP tables -- 2.11.0