This is an automated email from the ASF dual-hosted git repository.
chenjinbao1989 pushed a commit to branch cbdb-postgres-merge
in repository https://gitbox.apache.org/repos/asf/cloudberry.git
The following commit(s) were added to refs/heads/cbdb-postgres-merge by this
push:
new e659cd59ec5 Fix conflict for heap.c storage.c in catalog
e659cd59ec5 is described below
commit e659cd59ec5e5847fa6819cb9558eee8e5c07f5a
Author: Jinbao Chen <[email protected]>
AuthorDate: Thu Jul 17 20:32:03 2025 +0800
Fix conflict for heap.c storage.c in catalog
---
src/backend/catalog/heap.c | 415 ++-------------------------------------
src/backend/catalog/pg_attrdef.c | 36 +++-
src/backend/catalog/storage.c | 186 ++----------------
src/include/catalog/storage.h | 3 +-
4 files changed, 62 insertions(+), 578 deletions(-)
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index dbc7ce60990..edc96112b61 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -3,13 +3,9 @@
* heap.c
* code to create and destroy POSTGRES heap relations
*
-<<<<<<< HEAD
* Portions Copyright (c) 2005-2010, Greenplum inc
* Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
- * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
-=======
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
->>>>>>> REL_16_9
* Portions Copyright (c) 1994, Regents of the University of California
*
*
@@ -40,7 +36,6 @@
#include "access/relation.h"
#include "access/table.h"
#include "access/tableam.h"
-<<<<<<< HEAD
#include "access/toast_compression.h"
#include "access/transam.h"
#include "access/reloptions.h"
@@ -50,10 +45,6 @@
#include "catalog/catalog.h"
#include "catalog/dependency.h"
#include "catalog/gp_distribution_policy.h"
-=======
-#include "catalog/binary_upgrade.h"
-#include "catalog/catalog.h"
->>>>>>> REL_16_9
#include "catalog/heap.h"
#include "catalog/index.h"
#include "catalog/namespace.h"
@@ -79,11 +70,8 @@
#include "catalog/pg_tablespace.h"
#include "catalog/pg_type.h"
#include "catalog/storage.h"
-<<<<<<< HEAD
#include "catalog/storage_directory_table.h"
#include "catalog/storage_xlog.h"
-=======
->>>>>>> REL_16_9
#include "commands/tablecmds.h"
#include "commands/typecmds.h"
#include "miscadmin.h"
@@ -118,10 +106,15 @@
#include "utils/relcache.h"
#include "utils/timestamp.h"
-<<<<<<< HEAD
#include "catalog/gp_indexing.h"
#include "catalog/gp_matview_aux.h"
+/* Potentially set by pg_upgrade_support functions */
+Oid binary_upgrade_next_heap_pg_class_oid = InvalidOid;
+Oid binary_upgrade_next_toast_pg_class_oid = InvalidOid;
+RelFileNumber binary_upgrade_next_heap_pg_class_relfilenumber =
InvalidRelFileNumber;
+RelFileNumber binary_upgrade_next_toast_pg_class_relfilenumber =
InvalidRelFileNumber;
+
static void MetaTrackAddUpdInternal(Oid classid,
Oid
objoid,
Oid
relowner,
@@ -129,13 +122,6 @@ static void MetaTrackAddUpdInternal(Oid
classid,
char*
subtype,
Relation rel,
HeapTuple old_tuple);
-=======
-/* Potentially set by pg_upgrade_support functions */
-Oid binary_upgrade_next_heap_pg_class_oid = InvalidOid;
-Oid binary_upgrade_next_toast_pg_class_oid = InvalidOid;
-RelFileNumber binary_upgrade_next_heap_pg_class_relfilenumber =
InvalidRelFileNumber;
-RelFileNumber binary_upgrade_next_toast_pg_class_relfilenumber =
InvalidRelFileNumber;
->>>>>>> REL_16_9
static void AddNewRelationTuple(Relation pg_class_desc,
Relation
new_rel_desc,
@@ -427,7 +413,6 @@ heap_create(const char *relname,
create_storage = false;
else
{
-<<<<<<< HEAD
create_storage = true;
/*
* In PostgreSQL, the relation OID is used as the relfilenode
initially.
@@ -435,15 +420,8 @@ heap_create(const char *relname,
* to RelationBuildLocalRelation() to signal that it should
assign a
* a new value.
*/
- relfilenode = 1;
-=======
- /*
- * If relfilenumber is unspecified by the caller then create
storage
- * with oid same as relid.
- */
if (!RelFileNumberIsValid(relfilenumber))
- relfilenumber = relid;
->>>>>>> REL_16_9
+ relfilenumber = 1;
}
/*
@@ -482,50 +460,9 @@ heap_create(const char *relname,
*/
if (create_storage)
{
-<<<<<<< HEAD
RelationOpenSmgr(rel);
- switch (rel->rd_rel->relkind)
- {
- case RELKIND_VIEW:
- case RELKIND_COMPOSITE_TYPE:
- case RELKIND_FOREIGN_TABLE:
- case RELKIND_PARTITIONED_TABLE:
- case RELKIND_PARTITIONED_INDEX:
- Assert(false);
- break;
- case RELKIND_INDEX:
- case RELKIND_SEQUENCE:
- RelationCreateStorage(rel->rd_node,
relpersistence, SMGR_MD, rel);
- break;
-
- case RELKIND_RELATION:
- case RELKIND_TOASTVALUE:
- case RELKIND_MATVIEW:
- case RELKIND_DIRECTORY_TABLE:
- table_relation_set_new_filenode(rel,
&rel->rd_node,
-
relpersistence,
-
relfrozenxid, relminmxid);
- break;
-
- case RELKIND_AOSEGMENTS:
- case RELKIND_AOVISIMAP:
- case RELKIND_AOBLOCKDIR:
- Assert(rel->rd_tableam);
- table_relation_set_new_filenode(rel,
&rel->rd_node,
-
relpersistence,
-
relfrozenxid, relminmxid);
- break;
- }
-
- /*
- * AO tables don't use the buffer manager, better to not keep
the
- * smgr open for it.
- */
- if (RelationStorageIsAO(rel))
- RelationCloseSmgr(rel);
-=======
if (RELKIND_HAS_TABLE_AM(rel->rd_rel->relkind))
table_relation_set_new_filelocator(rel,
&rel->rd_locator,
relpersistence,
@@ -534,7 +471,13 @@ heap_create(const char *relname,
RelationCreateStorage(rel->rd_locator, relpersistence,
true);
else
Assert(false);
->>>>>>> REL_16_9
+
+ /*
+ * AO tables don't use the buffer manager, better to not keep
the
+ * smgr open for it.
+ */
+ if (RelationStorageIsAO(rel))
+ RelationCloseSmgr(rel);
}
/*
@@ -695,7 +638,6 @@ CheckAttributeType(const char *attname,
char att_typtype = get_typtype(atttypid);
Oid att_typelem;
-<<<<<<< HEAD
if (Gp_role == GP_ROLE_EXECUTE)
{
/*
@@ -704,10 +646,9 @@ CheckAttributeType(const char *attname,
*/
return;
}
-=======
+
/* since this function recurses, it could be driven to stack overflow */
check_stack_depth();
->>>>>>> REL_16_9
if (att_typtype == TYPTYPE_PSEUDO)
{
@@ -1404,36 +1345,8 @@ AddNewRelationTuple(Relation pg_class_desc,
/* Sequences always have a known size */
if (relkind == RELKIND_SEQUENCE)
{
-<<<<<<< HEAD
- case RELKIND_RELATION:
- case RELKIND_MATVIEW:
- case RELKIND_INDEX:
- case RELKIND_TOASTVALUE:
- case RELKIND_AOSEGMENTS:
- case RELKIND_AOBLOCKDIR:
- case RELKIND_AOVISIMAP:
- case RELKIND_DIRECTORY_TABLE:
- /* The relation is real, but as yet empty */
- new_rel_reltup->relpages = 0;
- new_rel_reltup->reltuples = -1;
- new_rel_reltup->relallvisible = 0;
- break;
- case RELKIND_SEQUENCE:
- /* Sequences always have a known size */
- new_rel_reltup->relpages = 1;
- new_rel_reltup->reltuples = 1;
- new_rel_reltup->relallvisible = 0;
- break;
- default:
- /* Views, etc, have no disk storage */
- new_rel_reltup->relpages = 0;
- new_rel_reltup->reltuples = -1;
- new_rel_reltup->relallvisible = 0;
- break;
-=======
new_rel_reltup->relpages = 1;
new_rel_reltup->reltuples = 1;
->>>>>>> REL_16_9
}
/* Initialize relfrozenxid and relminmxid */
@@ -1633,7 +1546,6 @@ heap_create_with_catalog(const char *relname,
/*
* Allocate an OID for the relation, unless we were told what to use.
*
-<<<<<<< HEAD
* In PostgreSQL, the OID will be the relfilenode as well, but in GPDB
* that is assigned separately.
*/
@@ -1641,66 +1553,6 @@ heap_create_with_catalog(const char *relname,
{
relid = GetNewOidForRelation(pg_class_desc, ClassOidIndexId,
Anum_pg_class_oid,
pstrdup(relname), relnamespace);
-=======
- * The OID will be the relfilenumber as well, so make sure it doesn't
- * collide with either pg_class OIDs or existing physical files.
- */
- if (!OidIsValid(relid))
- {
- /* Use binary-upgrade override for pg_class.oid and
relfilenumber */
- if (IsBinaryUpgrade)
- {
- /*
- * Indexes are not supported here; they use
- * binary_upgrade_next_index_pg_class_oid.
- */
- Assert(relkind != RELKIND_INDEX);
- Assert(relkind != RELKIND_PARTITIONED_INDEX);
-
- if (relkind == RELKIND_TOASTVALUE)
- {
- /* There might be no TOAST table, so we have to
test for it. */
- if
(OidIsValid(binary_upgrade_next_toast_pg_class_oid))
- {
- relid =
binary_upgrade_next_toast_pg_class_oid;
- binary_upgrade_next_toast_pg_class_oid
= InvalidOid;
-
- if
(!RelFileNumberIsValid(binary_upgrade_next_toast_pg_class_relfilenumber))
- ereport(ERROR,
-
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("toast
relfilenumber value not set when in binary upgrade mode")));
-
- relfilenumber =
binary_upgrade_next_toast_pg_class_relfilenumber;
-
binary_upgrade_next_toast_pg_class_relfilenumber = InvalidRelFileNumber;
- }
- }
- else
- {
- if
(!OidIsValid(binary_upgrade_next_heap_pg_class_oid))
- ereport(ERROR,
-
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("pg_class heap
OID value not set when in binary upgrade mode")));
-
- relid = binary_upgrade_next_heap_pg_class_oid;
- binary_upgrade_next_heap_pg_class_oid =
InvalidOid;
-
- if (RELKIND_HAS_STORAGE(relkind))
- {
- if
(!RelFileNumberIsValid(binary_upgrade_next_heap_pg_class_relfilenumber))
- ereport(ERROR,
-
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-
errmsg("relfilenumber value not set when in binary upgrade mode")));
-
- relfilenumber =
binary_upgrade_next_heap_pg_class_relfilenumber;
-
binary_upgrade_next_heap_pg_class_relfilenumber = InvalidRelFileNumber;
- }
- }
- }
-
- if (!OidIsValid(relid))
- relid = GetNewRelFileNumber(reltablespace,
pg_class_desc,
-
relpersistence);
->>>>>>> REL_16_9
}
/*
@@ -1979,13 +1831,7 @@ heap_create_with_catalog(const char *relname,
* No need to add an explicit dependency for the toast table,
as the
* main table depends on it.
*/
-<<<<<<< HEAD
- if (relkind == RELKIND_RELATION ||
- relkind == RELKIND_DIRECTORY_TABLE ||
- relkind == RELKIND_MATVIEW)
-=======
if (RELKIND_HAS_TABLE_AM(relkind) && relkind !=
RELKIND_TOASTVALUE)
->>>>>>> REL_16_9
{
ObjectAddressSet(referenced, AccessMethodRelationId,
accessmtd);
add_exact_object_address(&referenced, addrs);
@@ -2485,9 +2331,8 @@ heap_drop_with_catalog(Oid relid)
*/
if (rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE)
{
-<<<<<<< HEAD
- Relation rel;
- HeapTuple tuple;
+ Relation ftrel;
+ HeapTuple fttuple;
ScanKeyData ftkey;
SysScanDesc ftscan;
@@ -2508,10 +2353,6 @@ heap_drop_with_catalog(Oid relid)
systable_endscan(ftscan);
table_close(rel, RowExclusiveLock);
-=======
- Relation ftrel;
- HeapTuple fttuple;
->>>>>>> REL_16_9
ftrel = table_open(ForeignTableRelationId, RowExclusiveLock);
@@ -2851,223 +2692,6 @@ SetAttrMissing(Oid relid, char *attname, char *value)
}
/*
-<<<<<<< HEAD
- * Store a default expression for column attnum of relation rel.
- *
- * Returns the OID of the new pg_attrdef tuple.
- *
- * add_column_mode must be true if we are storing the default for a new
- * attribute, and false if it's for an already existing attribute. The reason
- * for this is that the missing value must never be updated after it is set,
- * which can only be when a column is added to the table. Otherwise we would
- * in effect be changing existing tuples.
- *
- * In GPDB in add_column_mode, the QD evaluates the default expression, and
- * the QEs must use the pre-computed value. In QD, this function evaluates
- * the value - like in upstream - and returns it in
- * *missingval_p/missingIsNull_p. In the QE, the caller is expected to pass
- * the pre-computed values in missingval/missingIsNull.
- */
-Oid
-StoreAttrDefault(Relation rel, AttrNumber attnum,
- Node *expr,
- bool *cookedMissingVal,
- Datum *missingval_p,
- bool *missingIsNull_p,
- bool is_internal, bool add_column_mode)
-{
- char *adbin;
- Relation adrel;
- HeapTuple tuple;
- Datum values[4];
- static bool nulls[4] = {false, false, false, false};
- Relation attrrel;
- HeapTuple atttup;
- Form_pg_attribute attStruct;
- char attgenerated;
- Oid attrdefOid;
- ObjectAddress colobject,
- defobject;
-
- adrel = table_open(AttrDefaultRelationId, RowExclusiveLock);
-
- /*
- * Flatten expression to string form for storage.
- */
- adbin = nodeToString(expr);
-
- /*
- * Make the pg_attrdef entry.
- */
- attrdefOid = GetNewOidForAttrDefault(adrel, AttrDefaultOidIndexId,
-
Anum_pg_attrdef_oid,
-
RelationGetRelid(rel),
-
attnum);
- values[Anum_pg_attrdef_oid - 1] = ObjectIdGetDatum(attrdefOid);
- values[Anum_pg_attrdef_adrelid - 1] = RelationGetRelid(rel);
- values[Anum_pg_attrdef_adnum - 1] = attnum;
- values[Anum_pg_attrdef_adbin - 1] = CStringGetTextDatum(adbin);
-
- tuple = heap_form_tuple(adrel->rd_att, values, nulls);
- CatalogTupleInsert(adrel, tuple);
-
- defobject.classId = AttrDefaultRelationId;
- defobject.objectId = attrdefOid;
- defobject.objectSubId = 0;
-
- table_close(adrel, RowExclusiveLock);
-
- /* now can free some of the stuff allocated above */
- pfree(DatumGetPointer(values[Anum_pg_attrdef_adbin - 1]));
- heap_freetuple(tuple);
- pfree(adbin);
-
- /*
- * Update the pg_attribute entry for the column to show that a default
- * exists.
- */
- attrrel = table_open(AttributeRelationId, RowExclusiveLock);
- atttup = SearchSysCacheCopy2(ATTNUM,
-
ObjectIdGetDatum(RelationGetRelid(rel)),
-
Int16GetDatum(attnum));
- if (!HeapTupleIsValid(atttup))
- elog(ERROR, "cache lookup failed for attribute %d of relation
%u",
- attnum, RelationGetRelid(rel));
- attStruct = (Form_pg_attribute) GETSTRUCT(atttup);
- attgenerated = attStruct->attgenerated;
- if (!attStruct->atthasdef)
- {
- Form_pg_attribute defAttStruct;
-
- ExprState *exprState;
- Expr *expr2 = (Expr *) expr;
- EState *estate = NULL;
- ExprContext *econtext;
- Datum valuesAtt[Natts_pg_attribute];
- bool nullsAtt[Natts_pg_attribute];
- bool replacesAtt[Natts_pg_attribute];
- Datum missingval = (Datum) 0;
- bool missingIsNull = true;
-
- MemSet(valuesAtt, 0, sizeof(valuesAtt));
- MemSet(nullsAtt, false, sizeof(nullsAtt));
- MemSet(replacesAtt, false, sizeof(replacesAtt));
- valuesAtt[Anum_pg_attribute_atthasdef - 1] = true;
- replacesAtt[Anum_pg_attribute_atthasdef - 1] = true;
-
- if ((rel->rd_rel->relkind == RELKIND_RELATION ||
rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) &&
- add_column_mode && !attgenerated && cookedMissingVal &&
*cookedMissingVal)
- {
- missingval = *missingval_p;
- missingIsNull = *missingIsNull_p;
- }
- else if ((rel->rd_rel->relkind == RELKIND_RELATION ||
rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) &&
- add_column_mode && !attgenerated)
- {
- expr2 = expression_planner(expr2);
- estate = CreateExecutorState();
- exprState = ExecPrepareExpr(expr2, estate);
- econtext = GetPerTupleExprContext(estate);
-
- missingval = ExecEvalExpr(exprState, econtext,
-
&missingIsNull);
-
- FreeExecutorState(estate);
-
- defAttStruct = TupleDescAttr(rel->rd_att, attnum - 1);
-
- if (missingIsNull)
- {
- /* if the default evaluates to NULL, just store
a NULL array */
- missingval = (Datum) 0;
- }
- else
- {
- /* otherwise make a one-element array of the
value */
- missingval =
PointerGetDatum(construct_array(&missingval,
-
1,
-
defAttStruct->atttypid,
-
defAttStruct->attlen,
-
defAttStruct->attbyval,
-
defAttStruct->attalign));
- }
- }
- if (add_column_mode && !attgenerated)
- {
- valuesAtt[Anum_pg_attribute_atthasmissing - 1] =
!missingIsNull;
- replacesAtt[Anum_pg_attribute_atthasmissing - 1] = true;
- valuesAtt[Anum_pg_attribute_attmissingval - 1] =
missingval;
- replacesAtt[Anum_pg_attribute_attmissingval - 1] = true;
- nullsAtt[Anum_pg_attribute_attmissingval - 1] =
missingIsNull;
-
- *cookedMissingVal = true;
- *missingval_p = missingval;
- *missingIsNull_p = missingIsNull;
- }
- atttup = heap_modify_tuple(atttup, RelationGetDescr(attrrel),
- valuesAtt,
nullsAtt, replacesAtt);
-
- CatalogTupleUpdate(attrrel, &atttup->t_self, atttup);
-
- /* GPDB: don't free it, it's returned to the caller */
- //if (!missingIsNull)
- // pfree(DatumGetPointer(missingval));
-
- }
- table_close(attrrel, RowExclusiveLock);
- heap_freetuple(atttup);
-
- /*
- * Make a dependency so that the pg_attrdef entry goes away if the
column
- * (or whole table) is deleted.
- */
- colobject.classId = RelationRelationId;
- colobject.objectId = RelationGetRelid(rel);
- colobject.objectSubId = attnum;
-
- recordDependencyOn(&defobject, &colobject, DEPENDENCY_AUTO);
-
- /*
- * Record dependencies on objects used in the expression, too.
- */
- if (attgenerated)
- {
- /*
- * Generated column: Dropping anything that the generation
expression
- * refers to automatically drops the generated column.
- */
- recordDependencyOnSingleRelExpr(&colobject, expr,
RelationGetRelid(rel),
-
DEPENDENCY_AUTO,
-
DEPENDENCY_AUTO, false);
- }
- else
- {
- /*
- * Normal default: Dropping anything that the default refers to
- * requires CASCADE and drops the default only.
- */
- recordDependencyOnSingleRelExpr(&defobject, expr,
RelationGetRelid(rel),
-
DEPENDENCY_NORMAL,
-
DEPENDENCY_NORMAL, false);
- }
-
- /*
- * Post creation hook for attribute defaults.
- *
- * XXX. ALTER TABLE ALTER COLUMN SET/DROP DEFAULT is implemented with a
- * couple of deletion/creation of the attribute's default entry, so the
- * callee should check existence of an older version of this entry if it
- * needs to distinguish.
- */
- InvokeObjectPostCreateHookArg(AttrDefaultRelationId,
-
RelationGetRelid(rel), attnum, is_internal);
-
- return attrdefOid;
-}
-
-/*
-=======
->>>>>>> REL_16_9
* Store a check-constraint expression for the given relation.
*
* Caller is responsible for updating the count of constraints
@@ -3335,7 +2959,6 @@ AddRelationNewConstraints(Relation rel,
castNode(Const, expr)->constisnull))
continue;
-<<<<<<< HEAD
/* If the DEFAULT is volatile we cannot use a missing value */
if (colDef->missingMode && contain_volatile_functions((Node *)
expr))
colDef->missingMode = false;
@@ -3346,10 +2969,6 @@ AddRelationNewConstraints(Relation rel,
&colDef->missingIsNull,
is_internal,
colDef->missingMode);
-=======
- defOid = StoreAttrDefault(rel, colDef->attnum, expr,
is_internal,
- false);
->>>>>>> REL_16_9
cooked = (CookedConstraint *) palloc(sizeof(CookedConstraint));
cooked->contype = CONSTR_DEFAULT;
diff --git a/src/backend/catalog/pg_attrdef.c b/src/backend/catalog/pg_attrdef.c
index 1adec07009c..6498520645f 100644
--- a/src/backend/catalog/pg_attrdef.c
+++ b/src/backend/catalog/pg_attrdef.c
@@ -21,6 +21,7 @@
#include "catalog/dependency.h"
#include "catalog/indexing.h"
#include "catalog/objectaccess.h"
+#include "catalog/oid_dispatch.h"
#include "catalog/pg_attrdef.h"
#include "executor/executor.h"
#include "optimizer/optimizer.h"
@@ -44,7 +45,11 @@
*/
Oid
StoreAttrDefault(Relation rel, AttrNumber attnum,
- Node *expr, bool is_internal, bool
add_column_mode)
+ Node *expr,
+ bool *cookedMissingVal,
+ Datum *missingval_p,
+ bool *missingIsNull_p,
+ bool is_internal, bool add_column_mode)
{
char *adbin;
Relation adrel;
@@ -69,8 +74,10 @@ StoreAttrDefault(Relation rel, AttrNumber attnum,
/*
* Make the pg_attrdef entry.
*/
- attrdefOid = GetNewOidWithIndex(adrel, AttrDefaultOidIndexId,
-
Anum_pg_attrdef_oid);
+ attrdefOid = GetNewOidForAttrDefault(adrel, AttrDefaultOidIndexId,
+
Anum_pg_attrdef_oid,
+
RelationGetRelid(rel),
+
attnum);
values[Anum_pg_attrdef_oid - 1] = ObjectIdGetDatum(attrdefOid);
values[Anum_pg_attrdef_adrelid - 1] = RelationGetRelid(rel);
values[Anum_pg_attrdef_adnum - 1] = attnum;
@@ -126,8 +133,14 @@ StoreAttrDefault(Relation rel, AttrNumber attnum,
* it in back branches on the slight chance that some extension
is
* depending on it.
*/
- if (rel->rd_rel->relkind == RELKIND_RELATION && add_column_mode
&&
- !attgenerated)
+ if ((rel->rd_rel->relkind == RELKIND_RELATION ||
rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) &&
+ add_column_mode && !attgenerated && cookedMissingVal &&
*cookedMissingVal)
+ {
+ missingval = *missingval_p;
+ missingIsNull = *missingIsNull_p;
+ }
+ else if ((rel->rd_rel->relkind == RELKIND_RELATION ||
rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) &&
+ add_column_mode && !attgenerated)
{
expr2 = expression_planner(expr2);
estate = CreateExecutorState();
@@ -157,19 +170,28 @@ StoreAttrDefault(Relation rel, AttrNumber attnum,
defAttStruct->attalign));
}
+
+ }
+ if (add_column_mode && !attgenerated)
+ {
valuesAtt[Anum_pg_attribute_atthasmissing - 1] =
!missingIsNull;
replacesAtt[Anum_pg_attribute_atthasmissing - 1] = true;
valuesAtt[Anum_pg_attribute_attmissingval - 1] =
missingval;
replacesAtt[Anum_pg_attribute_attmissingval - 1] = true;
nullsAtt[Anum_pg_attribute_attmissingval - 1] =
missingIsNull;
+
+ *cookedMissingVal = true;
+ *missingval_p = missingval;
+ *missingIsNull_p = missingIsNull;
}
atttup = heap_modify_tuple(atttup, RelationGetDescr(attrrel),
valuesAtt,
nullsAtt, replacesAtt);
CatalogTupleUpdate(attrrel, &atttup->t_self, atttup);
- if (!missingIsNull)
- pfree(DatumGetPointer(missingval));
+ /* GPDB: don't free it, it's returned to the caller */
+// if (!missingIsNull)
+// pfree(DatumGetPointer(missingval));
}
table_close(attrrel, RowExclusiveLock);
heap_freetuple(atttup);
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index 60cd554b54a..06190e942d1 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -40,8 +40,6 @@
/* GUC variables */
int wal_skip_threshold = 2048; /* in kilobytes */
-<<<<<<< HEAD
-=======
/*
* We keep a list of all relations (represented as RelFileLocator values)
* that have been created or deleted in the current transaction. When
@@ -62,16 +60,6 @@ int wal_skip_threshold = 2048; /* in
kilobytes */
* but I'm being paranoid.
*/
-typedef struct PendingRelDelete
-{
- RelFileLocator rlocator; /* relation that may need to be deleted
*/
- BackendId backend; /* InvalidBackendId if not a
temp rel */
- bool atCommit; /* T=delete at commit; F=delete
at abort */
- int nestLevel; /* xact nesting level
of request */
- struct PendingRelDelete *next; /* linked-list link */
-} PendingRelDelete;
->>>>>>> REL_16_9
-
typedef struct PendingRelSync
{
RelFileLocator rlocator;
@@ -155,12 +143,7 @@ AddPendingSync(const RelFileLocator *rlocator)
* pass register_delete = false.
*/
SMgrRelation
-<<<<<<< HEAD
-RelationCreateStorage(RelFileNode rnode, char relpersistence, SMgrImpl
smgr_which, Relation rel)
-=======
-RelationCreateStorage(RelFileLocator rlocator, char relpersistence,
- bool register_delete)
->>>>>>> REL_16_9
+RelationCreateStorage(RelFileLocator rlocator, char relpersistence, bool
register_delete, SMgrImpl smgr_which, Relation rel)
{
SMgrRelation srel;
BackendId backend;
@@ -187,24 +170,6 @@ RelationCreateStorage(RelFileLocator rlocator, char
relpersistence,
return NULL; /* placate compiler */
}
-<<<<<<< HEAD
- srel = smgropen(rnode, backend, smgr_which, rel);
- smgrcreate(srel, MAIN_FORKNUM, false);
-
- if (needs_wal)
- log_smgrcreate(&srel->smgr_rnode.node, MAIN_FORKNUM,
smgr_which);
-
- /* Add the relation to the list of stuff to delete at abort */
- pending = (PendingRelDelete *)
- MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete));
- pending->relnode.node = rnode;
- pending->relnode.isTempRelation = backend == TempRelBackendId;
- pending->atCommit = false; /* delete if abort */
- pending->nestLevel = GetCurrentTransactionNestLevel();
- pending->relnode.smgr_which = smgr_which;
- pending->action = &storage_pending_rel_deletes_action;
- RegisterPendingDelete(pending);
-=======
srel = smgropen(rlocator, backend);
smgrcreate(srel, MAIN_FORKNUM, false);
@@ -221,14 +186,15 @@ RelationCreateStorage(RelFileLocator rlocator, char
relpersistence,
pending = (PendingRelDelete *)
MemoryContextAlloc(TopMemoryContext,
sizeof(PendingRelDelete));
- pending->rlocator = rlocator;
+ pending->rlocator.node = rlocator;
+ pending->rlocator.isTempRelation = backend == TempRelBackendId;
pending->backend = backend;
pending->atCommit = false; /* delete if abort */
pending->nestLevel = GetCurrentTransactionNestLevel();
- pending->next = pendingDeletes;
- pendingDeletes = pending;
+ pending->rlocator.smgr_which = smgr_which;
+ pending->action = &storage_pending_rel_deletes_action;
+ RegisterPendingDelete(pending);
}
->>>>>>> REL_16_9
if (relpersistence == RELPERSISTENCE_PERMANENT && !XLogIsNeeded())
{
@@ -243,11 +209,7 @@ RelationCreateStorage(RelFileLocator rlocator, char
relpersistence,
* Perform XLogInsert of an XLOG_SMGR_CREATE record to WAL.
*/
void
-<<<<<<< HEAD
-log_smgrcreate(const RelFileNode *rnode, ForkNumber forkNum, SMgrImpl impl)
-=======
-log_smgrcreate(const RelFileLocator *rlocator, ForkNumber forkNum)
->>>>>>> REL_16_9
+log_smgrcreate(const RelFileLocator *rlocator, ForkNumber forkNum, SMgrImpl
impl)
{
xl_smgr_create xlrec;
@@ -275,16 +237,12 @@ RelationDropStorage(Relation rel)
/* Add the relation to the list of stuff to delete at commit */
pending = (PendingRelDelete *)
MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete));
-<<<<<<< HEAD
- pending->relnode.node = rel->rd_node;
- pending->relnode.isTempRelation = rel->rd_backend == TempRelBackendId;
-=======
- pending->rlocator = rel->rd_locator;
+ pending->rlocator.node = rel->rd_locator;
pending->backend = rel->rd_backend;
->>>>>>> REL_16_9
+ pending->rlocator.isTempRelation = rel->rd_backend == TempRelBackendId;
pending->atCommit = true; /* delete if commit */
pending->nestLevel = GetCurrentTransactionNestLevel();
- pending->relnode.smgr_which = smgr_get_impl(rel);
+ pending->rlocator.smgr_which = smgr_get_impl(rel);
pending->action = &storage_pending_rel_deletes_action;
RegisterPendingDelete(pending);
@@ -329,17 +287,13 @@ RelationPreserveStorage(RelFileLocator rlocator, bool
atCommit)
for (pending = pendingDeletes; pending != NULL; pending = next)
{
next = pending->next;
-<<<<<<< HEAD
Assert(pending->action);
if (!(pending->action->flags &
PENDING_REL_DELETE_NEED_PRESERVE))
{
continue;
}
- if (RelFileNodeEquals(rnode, pending->relnode.node)
-=======
- if (RelFileLocatorEquals(rlocator, pending->rlocator)
->>>>>>> REL_16_9
+ if (RelFileLocatorEquals(rlocator, pending->rlocator.node)
&& pending->atCommit == atCommit)
{
/* unlink and delete list entry */
@@ -422,24 +376,16 @@ RelationTruncate(Relation rel, BlockNumber nblocks)
RelationPreTruncate(rel);
/*
-<<<<<<< HEAD
- * Make sure that a concurrent checkpoint can't complete while
truncation
- * is in progress.
- *
- * The truncation operation might drop buffers that the checkpoint
-=======
* The code which follows can interact with concurrent checkpoints in
two
* separate ways.
*
* First, the truncation operation might drop buffers that the
checkpoint
->>>>>>> REL_16_9
* otherwise would have flushed. If it does, then it's essential that
the
* files actually get truncated on disk before the checkpoint record is
* written. Otherwise, if reply begins from that checkpoint, the
* to-be-truncated blocks might still exist on disk but have older
* contents than expected, which can cause replay to fail. It's OK for
the
* blocks to not exist on disk at all, but not for them to have the
wrong
-<<<<<<< HEAD
* contents.
*/
Assert(!MyProc->delayChkptEnd);
@@ -453,22 +399,6 @@ RelationTruncate(Relation rel, BlockNumber nblocks)
* would be worse than the disease. It would turn a usually harmless
* failure to truncate, that might spell trouble at WAL replay, into a
* certain PANIC.
-=======
- * contents. For this reason, we need to set DELAY_CHKPT_COMPLETE while
- * this code executes.
- *
- * Second, the call to smgrtruncate() below will in turn call
- * RegisterSyncRequest(). We need the sync request created by that call
to
- * be processed before the checkpoint completes. CheckPointGuts() will
- * call ProcessSyncRequests(), but if we register our sync request after
- * that happens, then the WAL record for the truncation could end up
- * preceding the checkpoint record, while the actual sync doesn't happen
- * until the next checkpoint. To prevent that, we need to set
- * DELAY_CHKPT_START here. That way, if the XLOG_SMGR_TRUNCATE precedes
- * the redo pointer of a concurrent checkpoint, we're guaranteed that
the
- * corresponding sync request will be processed before the checkpoint
- * completes.
->>>>>>> REL_16_9
*/
Assert((MyProc->delayChkptFlags & (DELAY_CHKPT_START |
DELAY_CHKPT_COMPLETE)) == 0);
MyProc->delayChkptFlags |= DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE;
@@ -486,8 +416,6 @@ RelationTruncate(Relation rel, BlockNumber nblocks)
*
* (See also pg_visibilitymap.c if changing this code.)
*/
- START_CRIT_SECTION();
-
if (RelationNeedsWAL(rel))
{
/*
@@ -522,16 +450,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks)
* longer exist after truncation is complete, and then truncate the
* corresponding files on disk.
*/
-<<<<<<< HEAD
smgrtruncate(rel->rd_smgr, forks, nforks, blocks);
-=======
- smgrtruncate2(RelationGetSmgr(rel), forks, nforks, old_blocks, blocks);
-
- END_CRIT_SECTION();
-
- /* We've done all the critical work, so checkpoints are OK now. */
- MyProc->delayChkptFlags &= ~(DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE);
->>>>>>> REL_16_9
/* We've done all the critical work, so checkpoints are OK now. */
MyProc->delayChkptEnd = false;
@@ -623,7 +542,6 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
smgrread(src, forkNum, blkno, buf.data);
-<<<<<<< HEAD
if (!PageIsVerifiedExtended(page, forkNum,
blkno,
PIV_LOG_WARNING | PIV_REPORT_STAT))
ereport(ERROR,
@@ -633,28 +551,6 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst,
relpathbackend(src->smgr_rnode.node,
src->smgr_rnode.backend,
forkNum))));
-=======
- if (!PageIsVerifiedExtended(page, blkno,
-
PIV_LOG_WARNING | PIV_REPORT_STAT))
- {
- /*
- * For paranoia's sake, capture the file path before
invoking the
- * ereport machinery. This guards against the
possibility of a
- * relcache flush caused by, e.g., an errcontext
callback.
- * (errcontext callbacks shouldn't be risking any such
thing, but
- * people have been known to forget that rule.)
- */
- char *relpath =
relpathbackend(src->smgr_rlocator.locator,
-
src->smgr_rlocator.backend,
-
forkNum);
-
- ereport(ERROR,
- (errcode(ERRCODE_DATA_CORRUPTED),
- errmsg("invalid page in block %u of
relation %s",
- blkno, relpath)));
- }
-
->>>>>>> REL_16_9
/*
* WAL-log the copied page. Unfortunately we don't know what
kind of a
* page this is, so we have to log the full page including any
unused
@@ -753,15 +649,10 @@ SerializePendingSyncs(Size maxSize, char *startAddress)
/* remove deleted rnodes */
for (delete = pendingDeletes; delete != NULL; delete = delete->next)
-<<<<<<< HEAD
{
Assert(delete->action);
if (delete->atCommit || !(delete->action->flags &
PENDING_REL_DELETE_NEED_SYNC))
(void) hash_search(tmphash, (void *) &delete->relnode,
-=======
- if (delete->atCommit)
- (void) hash_search(tmphash, &delete->rlocator,
->>>>>>> REL_16_9
HASH_REMOVE, NULL);
}
hash_seq_init(&scan, tmphash);
@@ -840,29 +731,9 @@ smgrDoPendingDeletes(bool isCommit)
/* do deletion if called for */
if (pending->atCommit == isCommit)
{
-<<<<<<< HEAD
Assert(pending->action);
Assert(pending->action->do_pending_rel_delete);
pending->action->do_pending_rel_delete(pending);
-=======
- SMgrRelation srel;
-
- srel = smgropen(pending->rlocator,
pending->backend);
-
- /* allocate the initial array, or extend it, if
needed */
- if (maxrels == 0)
- {
- maxrels = 8;
- srels = palloc(sizeof(SMgrRelation) *
maxrels);
- }
- else if (maxrels <= nrels)
- {
- maxrels *= 2;
- srels = repalloc(srels,
sizeof(SMgrRelation) * maxrels);
- }
-
- srels[nrels++] = srel;
->>>>>>> REL_16_9
}
/* must explicitly free the list entry */
@@ -913,15 +784,10 @@ smgrDoPendingSyncs(bool isCommit, bool isParallelWorker)
* the no need sync pending delete item.
*/
for (pending = pendingDeletes; pending != NULL; pending = pending->next)
-<<<<<<< HEAD
{
Assert(pending->action);
if (pending->atCommit || !(pending->action->flags &
PENDING_REL_DELETE_NEED_SYNC))
- (void) hash_search(pendingSyncHash, (void *)
&pending->relnode,
-=======
- if (pending->atCommit)
(void) hash_search(pendingSyncHash, &pending->rlocator,
->>>>>>> REL_16_9
HASH_REMOVE, NULL);
}
hash_seq_init(&scan, pendingSyncHash);
@@ -932,11 +798,7 @@ smgrDoPendingSyncs(bool isCommit, bool isParallelWorker)
uint64 total_blocks = 0;
SMgrRelation srel;
-<<<<<<< HEAD
- srel = smgropen(pendingsync->rnode, InvalidBackendId, SMGR_MD,
NULL);
-=======
- srel = smgropen(pendingsync->rlocator, InvalidBackendId);
->>>>>>> REL_16_9
+ srel = smgropen(pendingsync->rlocator, InvalidBackendId,
SMGR_MD, NULL);
/*
* We emit newpage WAL records for smaller relations.
@@ -1051,19 +913,11 @@ smgrDoPendingSyncs(bool isCommit, bool isParallelWorker)
* dropped at the end of COMMIT phase.
*/
int
-<<<<<<< HEAD
smgrGetPendingDeletes(bool forCommit, RelFileNodePendingDelete **ptr)
{
int nestLevel = GetCurrentTransactionNestLevel();
int nrels;
RelFileNodePendingDelete *rptr;
-=======
-smgrGetPendingDeletes(bool forCommit, RelFileLocator **ptr)
-{
- int nestLevel = GetCurrentTransactionNestLevel();
- int nrels;
- RelFileLocator *rptr;
->>>>>>> REL_16_9
PendingRelDelete *pending;
nrels = 0;
@@ -1090,11 +944,7 @@ smgrGetPendingDeletes(bool forCommit, RelFileLocator
**ptr)
*ptr = NULL;
return 0;
}
-<<<<<<< HEAD
rptr = (RelFileNodePendingDelete *) palloc(nrels *
sizeof(RelFileNodePendingDelete));
-=======
- rptr = (RelFileLocator *) palloc(nrels * sizeof(RelFileLocator));
->>>>>>> REL_16_9
*ptr = rptr;
for (pending = pendingDeletes; pending != NULL; pending = pending->next)
{
@@ -1203,11 +1053,7 @@ smgr_redo(XLogReaderState *record)
xl_smgr_create *xlrec = (xl_smgr_create *)
XLogRecGetData(record);
SMgrRelation reln;
-<<<<<<< HEAD
- reln = smgropen(xlrec->rnode, InvalidBackendId, xlrec->impl,
NULL);
-=======
- reln = smgropen(xlrec->rlocator, InvalidBackendId);
->>>>>>> REL_16_9
+ reln = smgropen(xlrec->rlocator, InvalidBackendId, xlrec->impl,
NULL);
smgrcreate(reln, xlrec->forkNum, true);
}
else if (info == XLOG_SMGR_TRUNCATE)
@@ -1221,16 +1067,12 @@ smgr_redo(XLogReaderState *record)
int nforks = 0;
bool need_fsm_vacuum = false;
-<<<<<<< HEAD
/*
* AO-specific implementation of SMGR is not needed because
truncate
* for AO takes a different code path, it does not involve
emitting
* SMGR_TRUNCATE WAL record.
*/
- reln = smgropen(xlrec->rnode, InvalidBackendId, SMGR_MD, NULL);
-=======
- reln = smgropen(xlrec->rlocator, InvalidBackendId);
->>>>>>> REL_16_9
+ reln = smgropen(xlrec->rlocator, InvalidBackendId, SMGR_MD,
NULL);
/*
* Forcibly create relation if it doesn't exist (which suggests
that
diff --git a/src/include/catalog/storage.h b/src/include/catalog/storage.h
index 56358dcf512..a921ab22e45 100644
--- a/src/include/catalog/storage.h
+++ b/src/include/catalog/storage.h
@@ -46,8 +46,9 @@ typedef struct PendingRelDelete
{
struct PendingRelDeleteAction *action; /* The action is to do pending
* delete */
- RelFileNodePendingDelete relnode; /* relation that may need to be
+ RelFileNodePendingDelete rlocator; /* relation that may need to be
* deleted */
+ BackendId backend; /* InvalidBackendId if not a
temp rel */
bool atCommit; /* T=delete at commit; F=delete
at abort */
int nestLevel; /* xact nesting level
of request */
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]