From 02d5adeed938cd9d27f07c05bd0705a7117ca13e Mon Sep 17 00:00:00 2001 From: chenxiaobin19 <1025221611@qq.com> Date: Mon, 17 Jul 2023 21:46:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9B=B4=E6=96=B0=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E4=B8=BAdefault=E5=A4=B1=E6=95=88=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../optimizer/rewrite/rewriteHandler.cpp | 8 ++++--- src/test/regress/expected/multi_update.out | 23 +++++++++++++++++++ src/test/regress/expected/updatable_views.out | 18 +++++++++++++++ src/test/regress/sql/multi_update.sql | 5 ++++ src/test/regress/sql/updatable_views.sql | 11 +++++++++ 5 files changed, 62 insertions(+), 3 deletions(-) diff --git a/src/gausskernel/optimizer/rewrite/rewriteHandler.cpp b/src/gausskernel/optimizer/rewrite/rewriteHandler.cpp index 4efc0ffe3..60b345ab9 100644 --- a/src/gausskernel/optimizer/rewrite/rewriteHandler.cpp +++ b/src/gausskernel/optimizer/rewrite/rewriteHandler.cpp @@ -791,7 +791,7 @@ static List* rewriteTargetListIU(List* targetList, CmdType commandType, Relation ereport(DEBUG2, (errmodule(MOD_PARSER), errcode(ERRCODE_LOG), errmsg("default column \"%s\" is effectively NULL, and hence omitted.", NameStr(att_tup->attname)))); - } else { + } else if (target_relation->rd_rel->relkind != RELKIND_VIEW) { new_expr = (Node*)makeConst(att_tup->atttypid, -1, att_tup->attcollation, @@ -936,7 +936,7 @@ static void rewriteTargetListMutilUpdate(Query* parsetree, List* rtable, List* r new_tle = NULL; } else if (applyDefault) { Node* new_expr = build_column_default(target_relation, attrno, true); - if (new_expr == NULL) { + if (new_expr == NULL && target_relation->rd_rel->relkind != RELKIND_VIEW) { new_expr = (Node*)makeConst(att_tup->atttypid, -1, att_tup->attcollation, @@ -948,7 +948,9 @@ static void rewriteTargetListMutilUpdate(Query* parsetree, List* rtable, List* r new_expr = coerce_to_domain( new_expr, InvalidOid, -1, att_tup->atttypid, COERCE_IMPLICIT_CAST, -1, false, false); } - new_tle = makeTargetEntry((Expr*)new_expr, attrno, pstrdup(NameStr(att_tup->attname)), false); + if (new_expr != NULL) { + new_tle = makeTargetEntry((Expr*)new_expr, attrno, pstrdup(NameStr(att_tup->attname)), false); + } new_tle->rtindex = result_relation; } diff --git a/src/test/regress/expected/multi_update.out b/src/test/regress/expected/multi_update.out index 848600916..965c0dd0b 100644 --- a/src/test/regress/expected/multi_update.out +++ b/src/test/regress/expected/multi_update.out @@ -1326,6 +1326,29 @@ select * from t_t_mutil_t3; 1 | 6 (2 rows) +alter table t_t_mutil_t1 alter column col2 set default 999; +update t_t_mutil_t1 a,multiview2 b,t_t_mutil_t3 c set a.col2 = default, b.col2 = 5,c.col2 = 6 where a.col1 = b.col1 and a.col1 = c.col1; +select * from t_t_mutil_t1; + col1 | col2 +------+------ + 1 | 999 + 1 | 999 +(2 rows) + +select * from t_t_mutil_t2; + col1 | col2 | col3 +------+------+------ + 1 | 5 | + 1 | 5 | +(2 rows) + +select * from t_t_mutil_t3; + col1 | col2 +------+------ + 1 | 6 + 1 | 6 +(2 rows) + -- left join update multiview1 a left join multiview2 b on a.col1=b.col1 set a.col2=7,b.col2=8; select * from t_t_mutil_t1; diff --git a/src/test/regress/expected/updatable_views.out b/src/test/regress/expected/updatable_views.out index 3404210b7..777d4c9e7 100644 --- a/src/test/regress/expected/updatable_views.out +++ b/src/test/regress/expected/updatable_views.out @@ -2472,5 +2472,23 @@ explain (costs off) UPDATE ro_view1 SET a = a + b; UPDATE ro_view1 SET a = a + b; ERROR: new row violates WITH CHECK OPTION for view "ro_view1" DETAIL: Failing row contains (10, 2). +create table default_t (a int, b varchar default 'table default'); +insert into default_t values (1, 'dec'); +create view default_v as select b, a from default_t; +update default_v set b = default where a = 1; +select * from default_v; + b | a +---------------+--- + table default | 1 +(1 row) + +alter view default_v alter column b set default 'view default'; +update default_v set b = default where a = 1; +select * from default_v; + b | a +--------------+--- + view default | 1 +(1 row) + \c regression drop database updatable_views_db; diff --git a/src/test/regress/sql/multi_update.sql b/src/test/regress/sql/multi_update.sql index 7e9f9b583..779663810 100644 --- a/src/test/regress/sql/multi_update.sql +++ b/src/test/regress/sql/multi_update.sql @@ -593,6 +593,11 @@ update t_t_mutil_t1 a,multiview2 b,t_t_mutil_t3 c set a.col2 = 4, b.col2 = 5,c.c select * from t_t_mutil_t1; select * from t_t_mutil_t2; select * from t_t_mutil_t3; +alter table t_t_mutil_t1 alter column col2 set default 999; +update t_t_mutil_t1 a,multiview2 b,t_t_mutil_t3 c set a.col2 = default, b.col2 = 5,c.col2 = 6 where a.col1 = b.col1 and a.col1 = c.col1; +select * from t_t_mutil_t1; +select * from t_t_mutil_t2; +select * from t_t_mutil_t3; -- left join update multiview1 a left join multiview2 b on a.col1=b.col1 set a.col2=7,b.col2=8; select * from t_t_mutil_t1; diff --git a/src/test/regress/sql/updatable_views.sql b/src/test/regress/sql/updatable_views.sql index f97fce2c9..84264efcf 100644 --- a/src/test/regress/sql/updatable_views.sql +++ b/src/test/regress/sql/updatable_views.sql @@ -1264,5 +1264,16 @@ set enable_bitmapscan = off; explain (costs off) UPDATE ro_view1 SET a = a + b; UPDATE ro_view1 SET a = a + b; +create table default_t (a int, b varchar default 'table default'); +insert into default_t values (1, 'dec'); +create view default_v as select b, a from default_t; + +update default_v set b = default where a = 1; +select * from default_v; + +alter view default_v alter column b set default 'view default'; +update default_v set b = default where a = 1; +select * from default_v; + \c regression drop database updatable_views_db; \ No newline at end of file