From a38d655467f5c9dbc1062357b7f5e757504a4057 Mon Sep 17 00:00:00 2001 From: lukeman Date: Thu, 24 Apr 2025 21:42:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86issue=EF=BC=9Anotnull?= =?UTF-8?q?=E4=B8=94=E6=97=A0default=E5=80=BC=E7=9A=84date=E5=88=97?= =?UTF-8?q?=E6=8F=92=E5=85=A5null=EF=BC=8C=E7=BB=93=E6=9E=9C=E4=B8=8EMySQL?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/runtime/executor/execUtils.cpp | 8 ++++---- src/gausskernel/runtime/executor/nodeModifyTable.cpp | 12 ++++++++---- src/gausskernel/runtime/opfusion/opfusion_insert.cpp | 7 +++++-- src/gausskernel/runtime/opfusion/opfusion_update.cpp | 4 +++- src/include/executor/executor.h | 3 +-- src/include/parser/parse_expr.h | 4 ++-- 6 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/gausskernel/runtime/executor/execUtils.cpp b/src/gausskernel/runtime/executor/execUtils.cpp index c157b3b9c8..cdee958a7d 100644 --- a/src/gausskernel/runtime/executor/execUtils.cpp +++ b/src/gausskernel/runtime/executor/execUtils.cpp @@ -2805,10 +2805,10 @@ void PthreadRwLockInit(pthread_rwlock_t* rwlock, pthread_rwlockattr_t *attr) /* * Get defaulted value of specific type */ -Datum GetTypeZeroValue(Form_pg_attribute att_tup) +Datum GetTypeZeroValue(Form_pg_attribute att_tup, bool can_ignore) { if (u_sess->hook_cxt.getTypeZeroValueHook != NULL) { - return ((getTypeZeroValueFunc)(u_sess->hook_cxt.getTypeZeroValueHook))(att_tup); + return ((getTypeZeroValueFunc)(u_sess->hook_cxt.getTypeZeroValueHook))(att_tup, can_ignore); } Datum result; switch (att_tup->atttypid) { @@ -2970,7 +2970,7 @@ Datum GetTypeZeroValue(Form_pg_attribute att_tup) * Replace tuple from the slot with a new one. The new tuple will replace null column with defaulted values according to * its type. */ -Tuple ReplaceTupleNullCol(TupleDesc tupleDesc, TupleTableSlot *slot) +Tuple ReplaceTupleNullCol(TupleDesc tupleDesc, TupleTableSlot *slot, bool canIgnore) { /* find out all null column first */ int natts = tupleDesc->natts; @@ -2989,7 +2989,7 @@ Tuple ReplaceTupleNullCol(TupleDesc tupleDesc, TupleTableSlot *slot) int attrChk; for (attrChk = 1; attrChk <= natts; attrChk++) { if (tupleDesc->attrs[attrChk - 1].attnotnull && tableam_tslot_attisnull(slot, attrChk)) { - values[attrChk - 1] = GetTypeZeroValue(&tupleDesc->attrs[attrChk - 1]); + values[attrChk - 1] = GetTypeZeroValue(&tupleDesc->attrs[attrChk - 1], canIgnore); replaces[attrChk - 1] = true; } } diff --git a/src/gausskernel/runtime/executor/nodeModifyTable.cpp b/src/gausskernel/runtime/executor/nodeModifyTable.cpp index 00beaa1d9f..dc4556c59a 100644 --- a/src/gausskernel/runtime/executor/nodeModifyTable.cpp +++ b/src/gausskernel/runtime/executor/nodeModifyTable.cpp @@ -1203,7 +1203,8 @@ TupleTableSlot* ExecInsertT(ModifyTableState* state, TupleTableSlot* slot, Tuple TupleTableSlot *tmp_slot = state->mt_insert_constr_slot == NULL ? slot : state->mt_insert_constr_slot; if (!ExecConstraints(result_rel_info, tmp_slot, estate, false, replaceNull)) { if (u_sess->utils_cxt.sql_ignore_strategy_val == SQL_OVERWRITE_NULL) { - tuple = ReplaceTupleNullCol(RelationGetDescr(result_relation_desc), tmp_slot); + bool can_ignore = estate->es_plannedstmt && estate->es_plannedstmt->hasIgnore; + tuple = ReplaceTupleNullCol(RelationGetDescr(result_relation_desc), tmp_slot, can_ignore); /* Double check constraints in case that new val in column with not null constraints * violated check constraints */ ExecConstraints(result_rel_info, tmp_slot, estate); @@ -1248,7 +1249,8 @@ TupleTableSlot* ExecInsertT(ModifyTableState* state, TupleTableSlot* slot, Tuple TupleTableSlot *tmp_slot = state->mt_insert_constr_slot == NULL ? slot : state->mt_insert_constr_slot; if (!ExecConstraints(result_rel_info, tmp_slot, estate, true, replaceNull)) { if (u_sess->utils_cxt.sql_ignore_strategy_val == SQL_OVERWRITE_NULL) { - tuple = ReplaceTupleNullCol(RelationGetDescr(result_relation_desc), tmp_slot); + bool canIgnore = estate->es_plannedstmt && estate->es_plannedstmt->hasIgnore; + tuple = ReplaceTupleNullCol(RelationGetDescr(result_relation_desc), tmp_slot, canIgnore); /* Double check constraints in case that new val in column with not null constraints * violated check constraints */ ExecConstraints(result_rel_info, tmp_slot, estate, true); @@ -2250,7 +2252,8 @@ TupleTableSlot* ExecUpdate(ItemPointer tupleid, TupleTableSlot *tmp_slot = node->mt_insert_constr_slot == NULL ? slot : node->mt_insert_constr_slot; if (!ExecConstraints(result_rel_info, tmp_slot, estate, false, CheckPluginReplaceNull())) { if (u_sess->utils_cxt.sql_ignore_strategy_val == SQL_OVERWRITE_NULL) { - tuple = ReplaceTupleNullCol(RelationGetDescr(result_relation_desc), tmp_slot); + bool can_ignore = estate->es_plannedstmt && estate->es_plannedstmt->hasIgnore; + tuple = ReplaceTupleNullCol(RelationGetDescr(result_relation_desc), tmp_slot, can_ignore); /* Double check constraints in case that new val in column with not null constraints * violated check constraints */ ExecConstraints(result_rel_info, tmp_slot, estate); @@ -2311,7 +2314,8 @@ lreplace: TupleTableSlot *tmp_slot = node->mt_update_constr_slot == NULL ? slot : node->mt_update_constr_slot; if (!ExecConstraints(result_rel_info, tmp_slot, estate, false, CheckPluginReplaceNull())) { if (u_sess->utils_cxt.sql_ignore_strategy_val == SQL_OVERWRITE_NULL) { - tuple = ReplaceTupleNullCol(RelationGetDescr(result_relation_desc), tmp_slot); + bool canIgnore = estate->es_plannedstmt && estate->es_plannedstmt->hasIgnore; + tuple = ReplaceTupleNullCol(RelationGetDescr(result_relation_desc), tmp_slot, canIgnore); /* Double check constraints in case that new val in column with not null constraints * violated check constraints */ ExecConstraints(result_rel_info, tmp_slot, estate); diff --git a/src/gausskernel/runtime/opfusion/opfusion_insert.cpp b/src/gausskernel/runtime/opfusion/opfusion_insert.cpp index 81be5e7430..70765928f7 100644 --- a/src/gausskernel/runtime/opfusion/opfusion_insert.cpp +++ b/src/gausskernel/runtime/opfusion/opfusion_insert.cpp @@ -333,7 +333,9 @@ unsigned long InsertFusion::ExecInsert(Relation rel, ResultRelInfo* result_rel_i partRel); return 0; } - tuple = ReplaceTupleNullCol(RelationGetDescr(result_rel_info->ri_RelationDesc), m_local.m_reslot); + bool can_ignore = m_c_local.m_estate->es_plannedstmt && m_c_local.m_estate->es_plannedstmt->hasIgnore; + tuple = + ReplaceTupleNullCol(RelationGetDescr(result_rel_info->ri_RelationDesc), m_local.m_reslot, can_ignore); /* Double check constraints in case that new val in column with not null constraints * violated check constraints */ ExecConstraints(result_rel_info, m_local.m_reslot, m_c_local.m_estate, true); @@ -832,7 +834,8 @@ TupleTableSlot* insert_real(ModifyTableState* state, TupleTableSlot* slot, EStat /* do nothing */ } else if (!ExecConstraints(result_rel_info, tmp_slot, estate, true)) { if (u_sess->utils_cxt.sql_ignore_strategy_val == SQL_OVERWRITE_NULL) { - tuple = ReplaceTupleNullCol(RelationGetDescr(result_relation_desc), tmp_slot); + bool canIgnore = estate->es_plannedstmt && estate->es_plannedstmt->hasIgnore; + tuple = ReplaceTupleNullCol(RelationGetDescr(result_relation_desc), tmp_slot, canIgnore); /* * Double check constraints in case that new val in column with not null constraints * violated check constraints diff --git a/src/gausskernel/runtime/opfusion/opfusion_update.cpp b/src/gausskernel/runtime/opfusion/opfusion_update.cpp index 10aae0eadc..3ecc91f268 100644 --- a/src/gausskernel/runtime/opfusion/opfusion_update.cpp +++ b/src/gausskernel/runtime/opfusion/opfusion_update.cpp @@ -404,7 +404,9 @@ lreplace: if (u_sess->utils_cxt.sql_ignore_strategy_val != SQL_OVERWRITE_NULL) { break; } - tup = ReplaceTupleNullCol(RelationGetDescr(result_rel_info->ri_RelationDesc), m_local.m_reslot); + bool can_ignore = m_c_local.m_estate->es_plannedstmt && m_c_local.m_estate->es_plannedstmt->hasIgnore; + tup = ReplaceTupleNullCol(RelationGetDescr(result_rel_info->ri_RelationDesc), m_local.m_reslot, + can_ignore); /* Double check constraints in case that new val in column with not null constraints * violated check constraints */ ExecConstraints(result_rel_info, m_local.m_reslot, m_c_local.m_estate); diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 94559077f0..b00565f835 100755 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -733,8 +733,7 @@ extern void ExecSimpleRelationDelete(EState *estate, EPQState *epqstate, TupleTa FakeRelationPartition *relAndPart); extern void CheckCmdReplicaIdentity(Relation rel, CmdType cmd); extern void GetFakeRelAndPart(EState *estate, Relation rel, TupleTableSlot *slot, FakeRelationPartition *relAndPart); -extern Datum GetTypeZeroValue(Form_pg_attribute att_tup); -extern Tuple ReplaceTupleNullCol(TupleDesc tupleDesc, TupleTableSlot* slot); +extern Tuple ReplaceTupleNullCol(TupleDesc tupleDesc, TupleTableSlot* slot, bool canIgnore = false); extern Datum ExecEvalArrayRef(ArrayRefExprState* astate, ExprContext* econtext, bool* isNull, ExprDoneCond* isDone); extern int ResourceOwnerForgetIfExistPthreadMutex(ResourceOwner owner, pthread_mutex_t* pMutex, bool trace); diff --git a/src/include/parser/parse_expr.h b/src/include/parser/parse_expr.h index fd8b6b2d36..40713c8aee 100644 --- a/src/include/parser/parse_expr.h +++ b/src/include/parser/parse_expr.h @@ -37,8 +37,8 @@ extern void AddStartWithTargetRelInfo(ParseState* pstate, Node* relNode, extern void AdaptSWSelectStmt(ParseState *pstate, SelectStmt *stmt); extern bool IsQuerySWCBRewrite(Query *query); extern bool IsSWCBRewriteRTE(RangeTblEntry *rte); -extern Datum GetTypeZeroValue(Form_pg_attribute att_tup); -typedef Datum (*getTypeZeroValueFunc)(Form_pg_attribute att_tup); +extern Datum GetTypeZeroValue(Form_pg_attribute att_tup, bool can_ignore = false); +typedef Datum (*getTypeZeroValueFunc)(Form_pg_attribute att_tup, bool can_ignore); extern PlannedStmt* getCursorStreamFromFuncArg(Node* node, CursorExpression** ce = NULL); #endif /* PARSE_EXPR_H */ -- Gitee