Allow to run certain multi-statement queries.
authorTatsuo Ishii <ishii@sraoss.co.jp>
Thu, 23 Feb 2023 10:35:08 +0000 (19:35 +0900)
committerTatsuo Ishii <ishii@sraoss.co.jp>
Thu, 23 Feb 2023 10:35:08 +0000 (19:35 +0900)
Previously multi-statement queries including INSERT/UPDATE was not
recognized as a multi-statement because of optimization for lengthy
INSERT/UPDATE queries in streaming replication mode. This commit
temporarily turns off the optimization and adds regression test for
that.

Hopefully before releasing 4.5 we find a way to determine whether the
query is a multi-statement query or not in less expensive way. And if
it is not a multi-statement query, we can turn on the optimization.

Discussion: https://www.pgpool.net/pipermail/pgpool-hackers/2023-February/004291.html

src/protocol/pool_proto_modules.c
src/test/regression/tests/001.load_balance/expected/expected7-r
src/test/regression/tests/001.load_balance/expected/expected7-r-pre15
src/test/regression/tests/001.load_balance/expected/expected7-s
src/test/regression/tests/001.load_balance/expected/expected7-s-pre15
src/test/regression/tests/001.load_balance/expected/expected8-s
src/test/regression/tests/001.load_balance/expected/expected8-s-pre15
src/test/regression/tests/001.load_balance/sql/7.sql

index ed45b51d05e6b4cbeeeeee669b7fd11bf5b606c0..d641cc1379e8b4faecbcab15da73e89c3414a37c 100644 (file)
@@ -257,7 +257,7 @@ SimpleQuery(POOL_CONNECTION * frontend,
        MemoryContext old_context = MemoryContextSwitchTo(query_context->memory_context);
 
        /* parse SQL string */
-       parse_tree_list = raw_parser(contents, RAW_PARSE_DEFAULT, len, &error, !REPLICATION);
+       parse_tree_list = raw_parser(contents, RAW_PARSE_DEFAULT, len, &error, false);
 
        if (parse_tree_list == NIL)
        {
index 4f8963f0e811d92e53ad0902c59d66fe2671a911..91736f895bdc75a184194a636cdb70111789dc11 100644 (file)
@@ -53,6 +53,45 @@ NOTICE:  DB node id: 1 statement: EXECUTE foo;
         2
 (1 row)
 
+-- DEALLOCATE
+DEALLOCATE foo;
+NOTICE:  DB node id: 0 statement: DEALLOCATE foo;
+NOTICE:  DB node id: 1 statement: DEALLOCATE foo;
+-- ROLLBACK TO
+ROLLBACK TO a;
+NOTICE:  DB node id: 1 statement: ROLLBACK TO a;
+NOTICE:  DB node id: 0 statement: ROLLBACK TO a;
+-- tx started by multi-statement query ends
+END;
+NOTICE:  DB node id: 1 statement: END;
+NOTICE:  DB node id: 0 statement: END;
+-- multi-statement query including BEGIN and INSERT
+DROP TABLE t1;
+NOTICE:  DB node id: 0 statement: DROP TABLE t1;
+NOTICE:  DB node id: 1 statement: DROP TABLE t1;
+CREATE TABLE t1(i INT);
+NOTICE:  DB node id: 0 statement: CREATE TABLE t1(i INT);
+NOTICE:  DB node id: 1 statement: CREATE TABLE t1(i INT);
+BEGIN\;INSERT INTO t1 VALUES(1);
+NOTICE:  DB node id: 0 statement: BEGIN;INSERT INTO t1 VALUES(1);
+NOTICE:  DB node id: 1 statement: BEGIN;INSERT INTO t1 VALUES(1);
+-- SAVEPOINT
+SAVEPOINT a;
+NOTICE:  DB node id: 0 statement: SAVEPOINT a;
+NOTICE:  DB node id: 1 statement: SAVEPOINT a;
+-- PREPARE
+PREPARE foo AS SELECT 2;
+NOTICE:  DB node id: 0 statement: PREPARE foo AS SELECT 2;
+NOTICE:  DB node id: 1 statement: PREPARE foo AS SELECT 2;
+-- EXECUTE
+EXECUTE foo;
+NOTICE:  DB node id: 0 statement: EXECUTE foo;
+NOTICE:  DB node id: 1 statement: EXECUTE foo;
+ ?column? 
+----------
+        2
+(1 row)
+
 -- DEALLOCATE
 DEALLOCATE foo;
 NOTICE:  DB node id: 0 statement: DEALLOCATE foo;
index bf28fb19d066ab4b4d942961f065d8a050ab2aa3..d36c1d085c96bf026a95adb012e24fa76ad9574a 100644 (file)
@@ -53,6 +53,45 @@ NOTICE:  DB node id: 1 statement: EXECUTE foo;
         2
 (1 row)
 
+-- DEALLOCATE
+DEALLOCATE foo;
+NOTICE:  DB node id: 0 statement: DEALLOCATE foo;
+NOTICE:  DB node id: 1 statement: DEALLOCATE foo;
+-- ROLLBACK TO
+ROLLBACK TO a;
+NOTICE:  DB node id: 1 statement: ROLLBACK TO a;
+NOTICE:  DB node id: 0 statement: ROLLBACK TO a;
+-- tx started by multi-statement query ends
+END;
+NOTICE:  DB node id: 1 statement: END;
+NOTICE:  DB node id: 0 statement: END;
+-- multi-statement query including BEGIN and INSERT
+DROP TABLE t1;
+NOTICE:  DB node id: 0 statement: DROP TABLE t1;
+NOTICE:  DB node id: 1 statement: DROP TABLE t1;
+CREATE TABLE t1(i INT);
+NOTICE:  DB node id: 0 statement: CREATE TABLE t1(i INT);
+NOTICE:  DB node id: 1 statement: CREATE TABLE t1(i INT);
+BEGIN\;INSERT INTO t1 VALUES(1);
+NOTICE:  DB node id: 0 statement: BEGIN;INSERT INTO t1 VALUES(1);
+NOTICE:  DB node id: 1 statement: BEGIN;INSERT INTO t1 VALUES(1);
+-- SAVEPOINT
+SAVEPOINT a;
+NOTICE:  DB node id: 0 statement: SAVEPOINT a;
+NOTICE:  DB node id: 1 statement: SAVEPOINT a;
+-- PREPARE
+PREPARE foo AS SELECT 2;
+NOTICE:  DB node id: 0 statement: PREPARE foo AS SELECT 2;
+NOTICE:  DB node id: 1 statement: PREPARE foo AS SELECT 2;
+-- EXECUTE
+EXECUTE foo;
+NOTICE:  DB node id: 0 statement: EXECUTE foo;
+NOTICE:  DB node id: 1 statement: EXECUTE foo;
+ ?column? 
+----------
+        2
+(1 row)
+
 -- DEALLOCATE
 DEALLOCATE foo;
 NOTICE:  DB node id: 0 statement: DEALLOCATE foo;
index 30510b4a3b8699c091b82042e783aa86a5bb496d..ba497a0e0a0398a731909f1a92f46054c6076128 100644 (file)
@@ -47,6 +47,36 @@ NOTICE:  DB node id: 0 statement: EXECUTE foo;
         2
 (1 row)
 
+-- DEALLOCATE
+DEALLOCATE foo;
+NOTICE:  DB node id: 0 statement: DEALLOCATE foo;
+-- ROLLBACK TO
+ROLLBACK TO a;
+NOTICE:  DB node id: 0 statement: ROLLBACK TO a;
+-- tx started by multi-statement query ends
+END;
+NOTICE:  DB node id: 0 statement: END;
+-- multi-statement query including BEGIN and INSERT
+DROP TABLE t1;
+NOTICE:  DB node id: 0 statement: DROP TABLE t1;
+CREATE TABLE t1(i INT);
+NOTICE:  DB node id: 0 statement: CREATE TABLE t1(i INT);
+BEGIN\;INSERT INTO t1 VALUES(1);
+NOTICE:  DB node id: 0 statement: BEGIN;INSERT INTO t1 VALUES(1);
+-- SAVEPOINT
+SAVEPOINT a;
+NOTICE:  DB node id: 0 statement: SAVEPOINT a;
+-- PREPARE
+PREPARE foo AS SELECT 2;
+NOTICE:  DB node id: 0 statement: PREPARE foo AS SELECT 2;
+-- EXECUTE
+EXECUTE foo;
+NOTICE:  DB node id: 0 statement: EXECUTE foo;
+ ?column? 
+----------
+        2
+(1 row)
+
 -- DEALLOCATE
 DEALLOCATE foo;
 NOTICE:  DB node id: 0 statement: DEALLOCATE foo;
index 66f47f9d127f15f0288d64e23c1be5c1f2db6833..d3b6b3cd57c6b4492aedabe93c5b712a5a5f93fe 100644 (file)
@@ -47,6 +47,36 @@ NOTICE:  DB node id: 0 statement: EXECUTE foo;
         2
 (1 row)
 
+-- DEALLOCATE
+DEALLOCATE foo;
+NOTICE:  DB node id: 0 statement: DEALLOCATE foo;
+-- ROLLBACK TO
+ROLLBACK TO a;
+NOTICE:  DB node id: 0 statement: ROLLBACK TO a;
+-- tx started by multi-statement query ends
+END;
+NOTICE:  DB node id: 0 statement: END;
+-- multi-statement query including BEGIN and INSERT
+DROP TABLE t1;
+NOTICE:  DB node id: 0 statement: DROP TABLE t1;
+CREATE TABLE t1(i INT);
+NOTICE:  DB node id: 0 statement: CREATE TABLE t1(i INT);
+BEGIN\;INSERT INTO t1 VALUES(1);
+NOTICE:  DB node id: 0 statement: BEGIN;INSERT INTO t1 VALUES(1);
+-- SAVEPOINT
+SAVEPOINT a;
+NOTICE:  DB node id: 0 statement: SAVEPOINT a;
+-- PREPARE
+PREPARE foo AS SELECT 2;
+NOTICE:  DB node id: 0 statement: PREPARE foo AS SELECT 2;
+-- EXECUTE
+EXECUTE foo;
+NOTICE:  DB node id: 0 statement: EXECUTE foo;
+ ?column? 
+----------
+        2
+(1 row)
+
 -- DEALLOCATE
 DEALLOCATE foo;
 NOTICE:  DB node id: 0 statement: DEALLOCATE foo;
index 43af8a8544587075dbb09c8f0bb5c5f09a89c602..99a18337f692ff434dabad31960c2c42d5a4e882 100644 (file)
@@ -47,6 +47,36 @@ NOTICE:  DB node id: 1 statement: EXECUTE foo;
         2
 (1 row)
 
+-- DEALLOCATE
+DEALLOCATE foo;
+NOTICE:  DB node id: 1 statement: DEALLOCATE foo;
+-- ROLLBACK TO
+ROLLBACK TO a;
+NOTICE:  DB node id: 1 statement: ROLLBACK TO a;
+-- tx started by multi-statement query ends
+END;
+NOTICE:  DB node id: 1 statement: END;
+-- multi-statement query including BEGIN and INSERT
+DROP TABLE t1;
+NOTICE:  DB node id: 1 statement: DROP TABLE t1;
+CREATE TABLE t1(i INT);
+NOTICE:  DB node id: 1 statement: CREATE TABLE t1(i INT);
+BEGIN\;INSERT INTO t1 VALUES(1);
+NOTICE:  DB node id: 1 statement: BEGIN;INSERT INTO t1 VALUES(1);
+-- SAVEPOINT
+SAVEPOINT a;
+NOTICE:  DB node id: 1 statement: SAVEPOINT a;
+-- PREPARE
+PREPARE foo AS SELECT 2;
+NOTICE:  DB node id: 1 statement: PREPARE foo AS SELECT 2;
+-- EXECUTE
+EXECUTE foo;
+NOTICE:  DB node id: 1 statement: EXECUTE foo;
+ ?column? 
+----------
+        2
+(1 row)
+
 -- DEALLOCATE
 DEALLOCATE foo;
 NOTICE:  DB node id: 1 statement: DEALLOCATE foo;
index d128cf8f14d1ce7001163336de8f72d17ad3699f..b0f84d0ef99bd6fad1bb481843f0f6db42fdd933 100644 (file)
@@ -47,6 +47,36 @@ NOTICE:  DB node id: 1 statement: EXECUTE foo;
         2
 (1 row)
 
+-- DEALLOCATE
+DEALLOCATE foo;
+NOTICE:  DB node id: 1 statement: DEALLOCATE foo;
+-- ROLLBACK TO
+ROLLBACK TO a;
+NOTICE:  DB node id: 1 statement: ROLLBACK TO a;
+-- tx started by multi-statement query ends
+END;
+NOTICE:  DB node id: 1 statement: END;
+-- multi-statement query including BEGIN and INSERT
+DROP TABLE t1;
+NOTICE:  DB node id: 1 statement: DROP TABLE t1;
+CREATE TABLE t1(i INT);
+NOTICE:  DB node id: 1 statement: CREATE TABLE t1(i INT);
+BEGIN\;INSERT INTO t1 VALUES(1);
+NOTICE:  DB node id: 1 statement: BEGIN;INSERT INTO t1 VALUES(1);
+-- SAVEPOINT
+SAVEPOINT a;
+NOTICE:  DB node id: 1 statement: SAVEPOINT a;
+-- PREPARE
+PREPARE foo AS SELECT 2;
+NOTICE:  DB node id: 1 statement: PREPARE foo AS SELECT 2;
+-- EXECUTE
+EXECUTE foo;
+NOTICE:  DB node id: 1 statement: EXECUTE foo;
+ ?column? 
+----------
+        2
+(1 row)
+
 -- DEALLOCATE
 DEALLOCATE foo;
 NOTICE:  DB node id: 1 statement: DEALLOCATE foo;
index 9e39d2764f0a521cd8f2e4ccf58aef78f65905e0..fe7554289773016ad6cba5797b050d12dab9d047 100644 (file)
@@ -20,6 +20,22 @@ DEALLOCATE foo;
 ROLLBACK TO a;
 -- tx started by multi-statement query ends
 END;
+-- multi-statement query including BEGIN and INSERT
+DROP TABLE t1;
+CREATE TABLE t1(i INT);
+BEGIN\;INSERT INTO t1 VALUES(1);
+-- SAVEPOINT
+SAVEPOINT a;
+-- PREPARE
+PREPARE foo AS SELECT 2;
+-- EXECUTE
+EXECUTE foo;
+-- DEALLOCATE
+DEALLOCATE foo;
+-- ROLLBACK TO
+ROLLBACK TO a;
+-- tx started by multi-statement query ends
+END;
 -- multi-statement query including BEGIN and ROLLBACK
 BEGIN\;SELECT 1\;ROLLBACK;
 -- ordinary read only SELECT: load balance expected