mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-18 12:26:59 +08:00
If a CHECK constraint or index definition contained a whole-row Var (that is, "table.*"), an attempt to copy that definition via CREATE TABLE LIKE or table inheritance produced incorrect results: the copied Var still claimed to have the rowtype of the source table, rather than the created table. For the LIKE case, it seems reasonable to just throw error for this situation, since the point of LIKE is that the new table is not permanently coupled to the old, so there's no reason to assume its rowtype will stay compatible. In the inheritance case, we should ideally allow such constraints, but doing so will require nontrivial refactoring of CREATE TABLE processing (because we'd need to know the OID of the new table's rowtype before we adjust inherited CHECK constraints). In view of the lack of previous complaints, that doesn't seem worth the risk in a back-patched bug fix, so just make it throw error for the inheritance case as well. Along the way, replace change_varattnos_of_a_node() with a more robust function map_variable_attnos(), which is capable of being extended to handle insertion of ConvertRowtypeExpr whenever we get around to fixing the inheritance case nicely, and in the meantime it returns a failure indication to the caller so that a helpful message with some context can be thrown. Also, this code will do the right thing with subselects (if we ever allow them in CHECK or indexes), and it range-checks varattnos before using them to index into the map array. Per report from Sergey Konoplev. Back-patch to all supported branches.
77 lines
2.3 KiB
C
77 lines
2.3 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* tablecmds.h
|
|
* prototypes for tablecmds.c.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/commands/tablecmds.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef TABLECMDS_H
|
|
#define TABLECMDS_H
|
|
|
|
#include "access/htup.h"
|
|
#include "nodes/parsenodes.h"
|
|
#include "storage/lock.h"
|
|
#include "utils/relcache.h"
|
|
|
|
|
|
extern Oid DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId);
|
|
|
|
extern void RemoveRelations(DropStmt *drop);
|
|
|
|
extern Oid AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode);
|
|
|
|
extern void AlterTable(Oid relid, LOCKMODE lockmode, AlterTableStmt *stmt);
|
|
|
|
extern LOCKMODE AlterTableGetLockLevel(List *cmds);
|
|
|
|
extern void ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lockmode);
|
|
|
|
extern void AlterTableInternal(Oid relid, List *cmds, bool recurse);
|
|
|
|
extern void AlterTableNamespace(AlterObjectSchemaStmt *stmt);
|
|
|
|
extern void AlterRelationNamespaceInternal(Relation classRel, Oid relOid,
|
|
Oid oldNspOid, Oid newNspOid,
|
|
bool hasDependEntry);
|
|
|
|
extern void CheckTableNotInUse(Relation rel, const char *stmt);
|
|
|
|
extern void ExecuteTruncate(TruncateStmt *stmt);
|
|
|
|
extern void SetRelationHasSubclass(Oid relationId, bool relhassubclass);
|
|
|
|
extern void renameatt(RenameStmt *stmt);
|
|
|
|
extern void RenameConstraint(RenameStmt *stmt);
|
|
|
|
extern void RenameRelation(RenameStmt *stmt);
|
|
|
|
extern void RenameRelationInternal(Oid myrelid,
|
|
const char *newrelname);
|
|
|
|
extern void find_composite_type_dependencies(Oid typeOid,
|
|
Relation origRelation,
|
|
const char *origTypeName);
|
|
|
|
extern void check_of_type(HeapTuple typetuple);
|
|
|
|
extern void register_on_commit_action(Oid relid, OnCommitAction action);
|
|
extern void remove_on_commit_action(Oid relid);
|
|
|
|
extern void PreCommit_on_commit_actions(void);
|
|
extern void AtEOXact_on_commit_actions(bool isCommit);
|
|
extern void AtEOSubXact_on_commit_actions(bool isCommit,
|
|
SubTransactionId mySubid,
|
|
SubTransactionId parentSubid);
|
|
|
|
extern void RangeVarCallbackOwnsTable(const RangeVar *relation,
|
|
Oid relId, Oid oldRelId, void *arg);
|
|
|
|
#endif /* TABLECMDS_H */
|