mirror of
https://github.com/postgres/postgres.git
synced 2025-11-07 19:06:32 +03:00
Identity columns
This is the SQL standard-conforming variant of PostgreSQL's serial columns. It fixes a few usability issues that serial columns have: - CREATE TABLE / LIKE copies default but refers to same sequence - cannot add/drop serialness with ALTER TABLE - dropping default does not drop sequence - need to grant separate privileges to sequence - other slight weirdnesses because serial is some kind of special macro Reviewed-by: Vitaly Burovoy <vitaly.burovoy@gmail.com>
This commit is contained in:
@@ -2003,6 +2003,20 @@ _copyCurrentOfExpr(const CurrentOfExpr *from)
|
||||
return newnode;
|
||||
}
|
||||
|
||||
/*
|
||||
* _copyNextValueExpr
|
||||
*/
|
||||
static NextValueExpr *
|
||||
_copyNextValueExpr(const NextValueExpr *from)
|
||||
{
|
||||
NextValueExpr *newnode = makeNode(NextValueExpr);
|
||||
|
||||
COPY_SCALAR_FIELD(seqid);
|
||||
COPY_SCALAR_FIELD(typeId);
|
||||
|
||||
return newnode;
|
||||
}
|
||||
|
||||
/*
|
||||
* _copyInferenceElem
|
||||
*/
|
||||
@@ -2790,6 +2804,7 @@ _copyColumnDef(const ColumnDef *from)
|
||||
COPY_SCALAR_FIELD(storage);
|
||||
COPY_NODE_FIELD(raw_default);
|
||||
COPY_NODE_FIELD(cooked_default);
|
||||
COPY_SCALAR_FIELD(identity);
|
||||
COPY_NODE_FIELD(collClause);
|
||||
COPY_SCALAR_FIELD(collOid);
|
||||
COPY_NODE_FIELD(constraints);
|
||||
@@ -2812,6 +2827,7 @@ _copyConstraint(const Constraint *from)
|
||||
COPY_SCALAR_FIELD(is_no_inherit);
|
||||
COPY_NODE_FIELD(raw_expr);
|
||||
COPY_STRING_FIELD(cooked_expr);
|
||||
COPY_SCALAR_FIELD(generated_when);
|
||||
COPY_NODE_FIELD(keys);
|
||||
COPY_NODE_FIELD(exclusions);
|
||||
COPY_NODE_FIELD(options);
|
||||
@@ -2920,6 +2936,7 @@ _copyQuery(const Query *from)
|
||||
COPY_NODE_FIELD(rtable);
|
||||
COPY_NODE_FIELD(jointree);
|
||||
COPY_NODE_FIELD(targetList);
|
||||
COPY_SCALAR_FIELD(override);
|
||||
COPY_NODE_FIELD(onConflict);
|
||||
COPY_NODE_FIELD(returningList);
|
||||
COPY_NODE_FIELD(groupClause);
|
||||
@@ -2963,6 +2980,7 @@ _copyInsertStmt(const InsertStmt *from)
|
||||
COPY_NODE_FIELD(onConflictClause);
|
||||
COPY_NODE_FIELD(returningList);
|
||||
COPY_NODE_FIELD(withClause);
|
||||
COPY_SCALAR_FIELD(override);
|
||||
|
||||
return newnode;
|
||||
}
|
||||
@@ -3811,6 +3829,7 @@ _copyCreateSeqStmt(const CreateSeqStmt *from)
|
||||
COPY_NODE_FIELD(sequence);
|
||||
COPY_NODE_FIELD(options);
|
||||
COPY_SCALAR_FIELD(ownerId);
|
||||
COPY_SCALAR_FIELD(for_identity);
|
||||
COPY_SCALAR_FIELD(if_not_exists);
|
||||
|
||||
return newnode;
|
||||
@@ -3823,6 +3842,7 @@ _copyAlterSeqStmt(const AlterSeqStmt *from)
|
||||
|
||||
COPY_NODE_FIELD(sequence);
|
||||
COPY_NODE_FIELD(options);
|
||||
COPY_SCALAR_FIELD(for_identity);
|
||||
COPY_SCALAR_FIELD(missing_ok);
|
||||
|
||||
return newnode;
|
||||
@@ -4927,6 +4947,9 @@ copyObjectImpl(const void *from)
|
||||
case T_CurrentOfExpr:
|
||||
retval = _copyCurrentOfExpr(from);
|
||||
break;
|
||||
case T_NextValueExpr:
|
||||
retval = _copyNextValueExpr(from);
|
||||
break;
|
||||
case T_InferenceElem:
|
||||
retval = _copyInferenceElem(from);
|
||||
break;
|
||||
|
||||
@@ -733,6 +733,15 @@ _equalCurrentOfExpr(const CurrentOfExpr *a, const CurrentOfExpr *b)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalNextValueExpr(const NextValueExpr *a, const NextValueExpr *b)
|
||||
{
|
||||
COMPARE_SCALAR_FIELD(seqid);
|
||||
COMPARE_SCALAR_FIELD(typeId);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalInferenceElem(const InferenceElem *a, const InferenceElem *b)
|
||||
{
|
||||
@@ -963,6 +972,7 @@ _equalQuery(const Query *a, const Query *b)
|
||||
COMPARE_NODE_FIELD(rtable);
|
||||
COMPARE_NODE_FIELD(jointree);
|
||||
COMPARE_NODE_FIELD(targetList);
|
||||
COMPARE_SCALAR_FIELD(override);
|
||||
COMPARE_NODE_FIELD(onConflict);
|
||||
COMPARE_NODE_FIELD(returningList);
|
||||
COMPARE_NODE_FIELD(groupClause);
|
||||
@@ -1002,6 +1012,7 @@ _equalInsertStmt(const InsertStmt *a, const InsertStmt *b)
|
||||
COMPARE_NODE_FIELD(onConflictClause);
|
||||
COMPARE_NODE_FIELD(returningList);
|
||||
COMPARE_NODE_FIELD(withClause);
|
||||
COMPARE_SCALAR_FIELD(override);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1713,6 +1724,7 @@ _equalCreateSeqStmt(const CreateSeqStmt *a, const CreateSeqStmt *b)
|
||||
COMPARE_NODE_FIELD(sequence);
|
||||
COMPARE_NODE_FIELD(options);
|
||||
COMPARE_SCALAR_FIELD(ownerId);
|
||||
COMPARE_SCALAR_FIELD(for_identity);
|
||||
COMPARE_SCALAR_FIELD(if_not_exists);
|
||||
|
||||
return true;
|
||||
@@ -1723,6 +1735,7 @@ _equalAlterSeqStmt(const AlterSeqStmt *a, const AlterSeqStmt *b)
|
||||
{
|
||||
COMPARE_NODE_FIELD(sequence);
|
||||
COMPARE_NODE_FIELD(options);
|
||||
COMPARE_SCALAR_FIELD(for_identity);
|
||||
COMPARE_SCALAR_FIELD(missing_ok);
|
||||
|
||||
return true;
|
||||
@@ -2530,6 +2543,7 @@ _equalColumnDef(const ColumnDef *a, const ColumnDef *b)
|
||||
COMPARE_SCALAR_FIELD(storage);
|
||||
COMPARE_NODE_FIELD(raw_default);
|
||||
COMPARE_NODE_FIELD(cooked_default);
|
||||
COMPARE_SCALAR_FIELD(identity);
|
||||
COMPARE_NODE_FIELD(collClause);
|
||||
COMPARE_SCALAR_FIELD(collOid);
|
||||
COMPARE_NODE_FIELD(constraints);
|
||||
@@ -2550,6 +2564,7 @@ _equalConstraint(const Constraint *a, const Constraint *b)
|
||||
COMPARE_SCALAR_FIELD(is_no_inherit);
|
||||
COMPARE_NODE_FIELD(raw_expr);
|
||||
COMPARE_STRING_FIELD(cooked_expr);
|
||||
COMPARE_SCALAR_FIELD(generated_when);
|
||||
COMPARE_NODE_FIELD(keys);
|
||||
COMPARE_NODE_FIELD(exclusions);
|
||||
COMPARE_NODE_FIELD(options);
|
||||
@@ -3099,6 +3114,9 @@ equal(const void *a, const void *b)
|
||||
case T_CurrentOfExpr:
|
||||
retval = _equalCurrentOfExpr(a, b);
|
||||
break;
|
||||
case T_NextValueExpr:
|
||||
retval = _equalNextValueExpr(a, b);
|
||||
break;
|
||||
case T_InferenceElem:
|
||||
retval = _equalInferenceElem(a, b);
|
||||
break;
|
||||
|
||||
@@ -246,6 +246,9 @@ exprType(const Node *expr)
|
||||
case T_CurrentOfExpr:
|
||||
type = BOOLOID;
|
||||
break;
|
||||
case T_NextValueExpr:
|
||||
type = ((const NextValueExpr *) expr)->typeId;
|
||||
break;
|
||||
case T_InferenceElem:
|
||||
{
|
||||
const InferenceElem *n = (const InferenceElem *) expr;
|
||||
@@ -919,6 +922,9 @@ exprCollation(const Node *expr)
|
||||
case T_CurrentOfExpr:
|
||||
coll = InvalidOid; /* result is always boolean */
|
||||
break;
|
||||
case T_NextValueExpr:
|
||||
coll = InvalidOid; /* result is always an integer type */
|
||||
break;
|
||||
case T_InferenceElem:
|
||||
coll = exprCollation((Node *) ((const InferenceElem *) expr)->expr);
|
||||
break;
|
||||
@@ -1122,6 +1128,9 @@ exprSetCollation(Node *expr, Oid collation)
|
||||
case T_CurrentOfExpr:
|
||||
Assert(!OidIsValid(collation)); /* result is always boolean */
|
||||
break;
|
||||
case T_NextValueExpr:
|
||||
Assert(!OidIsValid(collation)); /* result is always an integer type */
|
||||
break;
|
||||
default:
|
||||
elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr));
|
||||
break;
|
||||
@@ -1881,6 +1890,7 @@ expression_tree_walker(Node *node,
|
||||
case T_CaseTestExpr:
|
||||
case T_SetToDefault:
|
||||
case T_CurrentOfExpr:
|
||||
case T_NextValueExpr:
|
||||
case T_SQLValueFunction:
|
||||
case T_RangeTblRef:
|
||||
case T_SortGroupClause:
|
||||
@@ -2476,6 +2486,7 @@ expression_tree_mutator(Node *node,
|
||||
case T_CaseTestExpr:
|
||||
case T_SetToDefault:
|
||||
case T_CurrentOfExpr:
|
||||
case T_NextValueExpr:
|
||||
case T_SQLValueFunction:
|
||||
case T_RangeTblRef:
|
||||
case T_SortGroupClause:
|
||||
|
||||
@@ -2763,6 +2763,7 @@ _outColumnDef(StringInfo str, const ColumnDef *node)
|
||||
WRITE_CHAR_FIELD(storage);
|
||||
WRITE_NODE_FIELD(raw_default);
|
||||
WRITE_NODE_FIELD(cooked_default);
|
||||
WRITE_CHAR_FIELD(identity);
|
||||
WRITE_NODE_FIELD(collClause);
|
||||
WRITE_OID_FIELD(collOid);
|
||||
WRITE_NODE_FIELD(constraints);
|
||||
@@ -2868,6 +2869,7 @@ _outQuery(StringInfo str, const Query *node)
|
||||
WRITE_NODE_FIELD(rtable);
|
||||
WRITE_NODE_FIELD(jointree);
|
||||
WRITE_NODE_FIELD(targetList);
|
||||
WRITE_ENUM_FIELD(override, OverridingKind);
|
||||
WRITE_NODE_FIELD(onConflict);
|
||||
WRITE_NODE_FIELD(returningList);
|
||||
WRITE_NODE_FIELD(groupClause);
|
||||
@@ -3405,6 +3407,13 @@ _outConstraint(StringInfo str, const Constraint *node)
|
||||
WRITE_STRING_FIELD(cooked_expr);
|
||||
break;
|
||||
|
||||
case CONSTR_IDENTITY:
|
||||
appendStringInfoString(str, "IDENTITY");
|
||||
WRITE_NODE_FIELD(raw_expr);
|
||||
WRITE_STRING_FIELD(cooked_expr);
|
||||
WRITE_CHAR_FIELD(generated_when);
|
||||
break;
|
||||
|
||||
case CONSTR_CHECK:
|
||||
appendStringInfoString(str, "CHECK");
|
||||
WRITE_BOOL_FIELD(is_no_inherit);
|
||||
|
||||
@@ -247,6 +247,7 @@ _readQuery(void)
|
||||
READ_NODE_FIELD(rtable);
|
||||
READ_NODE_FIELD(jointree);
|
||||
READ_NODE_FIELD(targetList);
|
||||
READ_ENUM_FIELD(override, OverridingKind);
|
||||
READ_NODE_FIELD(onConflict);
|
||||
READ_NODE_FIELD(returningList);
|
||||
READ_NODE_FIELD(groupClause);
|
||||
|
||||
Reference in New Issue
Block a user