diff --git a/src/common/pl/plpgsql/src/gram.y b/src/common/pl/plpgsql/src/gram.y index 7a76b5ee1..97a80097e 100755 --- a/src/common/pl/plpgsql/src/gram.y +++ b/src/common/pl/plpgsql/src/gram.y @@ -521,6 +521,7 @@ static void processFunctionRecordOutParam(int varno, Oid funcoid, int* outparam) %token K_REF %token K_RELATIVE %token K_RELEASE +%token K_REPLACE %token K_RESULT_OID %token K_RETURN %token K_RETURNED_SQLSTATE @@ -3830,6 +3831,10 @@ stmt_execsql : K_ALTER { $$ = make_execsql_stmt(K_INSERT, @1); } + | K_REPLACE + { + $$ = make_execsql_stmt(K_REPLACE, @1); + } | K_SELECT /* DML:select */ { int tok = -1; @@ -8771,7 +8776,7 @@ make_execsql_stmt(int firsttoken, int location) if (tok == K_INTO) { - if (prev_tok == K_INSERT || (prev_tok == COMMENTSTRING && prev_prev_tok == K_INSERT)) { + if (prev_tok == K_INSERT || prev_tok == K_REPLACE || (prev_tok == COMMENTSTRING && (prev_prev_tok == K_INSERT || prev_prev_tok == K_REPLACE))) { insert_stmt = true; continue; /* INSERT INTO is not an INTO-target */ } diff --git a/src/common/pl/plpgsql/src/pl_scanner.cpp b/src/common/pl/plpgsql/src/pl_scanner.cpp index d986ffa2d..6a88c2d46 100644 --- a/src/common/pl/plpgsql/src/pl_scanner.cpp +++ b/src/common/pl/plpgsql/src/pl_scanner.cpp @@ -168,6 +168,7 @@ static const ScanKeyword unreserved_keywords[] = { PG_KEYWORD("record", K_RECORD, UNRESERVED_KEYWORD) PG_KEYWORD("relative", K_RELATIVE, UNRESERVED_KEYWORD) PG_KEYWORD("release", K_RELEASE, UNRESERVED_KEYWORD) + PG_KEYWORD("replace", K_REPLACE, UNRESERVED_KEYWORD) PG_KEYWORD("result_oid", K_RESULT_OID, UNRESERVED_KEYWORD) PG_KEYWORD("returned_sqlstate", K_RETURNED_SQLSTATE, UNRESERVED_KEYWORD) PG_KEYWORD("reverse", K_REVERSE, UNRESERVED_KEYWORD) diff --git a/src/gausskernel/runtime/executor/nodeModifyTable.cpp b/src/gausskernel/runtime/executor/nodeModifyTable.cpp index 7348b3704..ceb1585be 100644 --- a/src/gausskernel/runtime/executor/nodeModifyTable.cpp +++ b/src/gausskernel/runtime/executor/nodeModifyTable.cpp @@ -3250,7 +3250,7 @@ static TupleTableSlot* ExecReplace(EState* estate, ModifyTableState* node, Tuple slot = ExecInsert(node, slot, plan_slot, estate, node->canSetTag, hi_options, &partition_list); } } - + return slot; } /* ---------------------------------------------------------------- diff --git a/src/test/regress/expected/replaceinto.out b/src/test/regress/expected/replaceinto.out index 869bda51f..a6d323058 100644 --- a/src/test/regress/expected/replaceinto.out +++ b/src/test/regress/expected/replaceinto.out @@ -261,6 +261,26 @@ select * from replace_test2; 2 | bbbbb (3 rows) +create or replace procedure replace_p() as +begin +replace into replace_test2 values(1,'ccccc'); +end; +/ +call replace_p(); + replace_p +----------- + +(1 row) + +select * from replace_test2; + id | name +----+---------------------- + 1 | aaaaa + 1 | aaaaa + 2 | bbbbb + 1 | ccccc +(4 rows) + drop table replace_test2; create table t_range_list ( id number PRIMARY KEY not null, diff --git a/src/test/regress/sql/replaceinto.sql b/src/test/regress/sql/replaceinto.sql index 33357a577..b1d029d36 100644 --- a/src/test/regress/sql/replaceinto.sql +++ b/src/test/regress/sql/replaceinto.sql @@ -106,6 +106,15 @@ replace into replace_test2 values(1,'aaaaa'); replace into replace_test2 values(1,'aaaaa'); replace into replace_test2 values(2,'bbbbb'); select * from replace_test2; + +create or replace procedure replace_p() as +begin +replace into replace_test2 values(1,'ccccc'); +end; +/ + +call replace_p(); +select * from replace_test2; drop table replace_test2; create table t_range_list