CREATE TABLE t1(i INTEGER);
NOTICE: DB node id: 0 statement: CREATE TABLE t1(i INTEGER);
NOTICE: DB node id: 1 statement: CREATE TABLE t1(i INTEGER);
-CREATE TABLE
CREATE TABLE t2(i INTEGER);
NOTICE: DB node id: 0 statement: CREATE TABLE t2(i INTEGER);
NOTICE: DB node id: 1 statement: CREATE TABLE t2(i INTEGER);
-CREATE TABLE
CREATE FUNCTION f1(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
NOTICE: DB node id: 0 statement: CREATE FUNCTION f1(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
NOTICE: DB node id: 1 statement: CREATE FUNCTION f1(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
-CREATE FUNCTION
CREATE FUNCTION f2(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
NOTICE: DB node id: 0 statement: CREATE FUNCTION f2(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
NOTICE: DB node id: 1 statement: CREATE FUNCTION f2(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
-CREATE FUNCTION
-SELECT * FROM t1;
+SELECT * FROM t1; -- this load balances
NOTICE: DB node id: 1 statement: SELECT * FROM t1;
i
---
(0 rows)
-SELECT f1(1);
+SELECT f1(1); -- this does not load balance
NOTICE: DB node id: 0 statement: SELECT f1(1);
NOTICE: DB node id: 1 statement: SELECT f1(1);
f1
1
(1 row)
-SELECT public.f2(1);
+SELECT public.f2(1); -- this does not load balance
NOTICE: DB node id: 0 statement: SELECT public.f2(1);
NOTICE: DB node id: 1 statement: SELECT public.f2(1);
f2
CREATE TABLE t1(i INTEGER);
NOTICE: DB node id: 0 statement: CREATE TABLE t1(i INTEGER);
-CREATE TABLE
CREATE TABLE t2(i INTEGER);
NOTICE: DB node id: 0 statement: CREATE TABLE t2(i INTEGER);
-CREATE TABLE
CREATE FUNCTION f1(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
NOTICE: DB node id: 0 statement: CREATE FUNCTION f1(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
-CREATE FUNCTION
CREATE FUNCTION f2(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
NOTICE: DB node id: 0 statement: CREATE FUNCTION f2(INTEGER) returns INTEGER AS 'SELECT $1' LANGUAGE SQL;
-CREATE FUNCTION
-SELECT * FROM t1;
+SELECT * FROM t1; -- this load balances
NOTICE: DB node id: 1 statement: SELECT * FROM t1;
i
---
(0 rows)
-SELECT f1(1);
+SELECT f1(1); -- this does not load balance
NOTICE: DB node id: 0 statement: SELECT f1(1);
f1
----
1
(1 row)
-SELECT public.f2(1);
+SELECT public.f2(1); -- this does not load balance
NOTICE: DB node id: 0 statement: SELECT public.f2(1);
f2
----
-SELECT f1(1);
+SELECT f1(1); -- this does load balance
NOTICE: DB node id: 1 statement: SELECT f1(1);
f1
----
1
(1 row)
-SELECT public.f2(1);
+SELECT public.f2(1); -- this does load balance
NOTICE: DB node id: 1 statement: SELECT public.f2(1);
f2
----
-SELECT f1(1);
+SELECT f1(1); -- this does load balance
NOTICE: DB node id: 1 statement: SELECT f1(1);
f1
----
1
(1 row)
-SELECT public.f2(1);
+SELECT public.f2(1); -- this does load balance
NOTICE: DB node id: 1 statement: SELECT public.f2(1);
f2
----
BEGIN;
NOTICE: DB node id: 0 statement: BEGIN;
NOTICE: DB node id: 1 statement: BEGIN;
-BEGIN
SELECT 1;
NOTICE: DB node id: 0 statement: SELECT 1;
?column?
END;
NOTICE: DB node id: 1 statement: END;
NOTICE: DB node id: 0 statement: END;
-COMMIT
-SELECT f1(2);
+SELECT f1(2); -- this should be sent to all the nodes
NOTICE: DB node id: 0 statement: SELECT f1(2);
NOTICE: DB node id: 1 statement: SELECT f1(2);
f1
--- /dev/null
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE: DB node id: 1 statement: SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+NOTICE: DB node id: 0 statement: BEGIN;SELECT 1;
+NOTICE: DB node id: 1 statement: BEGIN;SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- ordinary read only SELECT: load balance expected
+SELECT 2;
+NOTICE: DB node id: 1 statement: SELECT 2;
+ ?column?
+----------
+ 2
+(1 row)
+
+-- 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
+BEGIN\;SELECT 1;
+NOTICE: DB node id: 0 statement: BEGIN;SELECT 1;
+NOTICE: DB node id: 1 statement: BEGIN;SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- 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;
+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 ROLLBACK
+BEGIN\;SELECT 1\;ROLLBACK;
+NOTICE: DB node id: 0 statement: BEGIN;SELECT 1;ROLLBACK;
+NOTICE: DB node id: 1 statement: BEGIN;SELECT 1;ROLLBACK;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE: DB node id: 1 statement: SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- multi-statement query including BEGIN and invalid query
+BEGIN\;SELECT 1\;FOO;
+NOTICE: DB node id: 0 statement: BEGIN;SELECT 1;FOO;
+NOTICE: DB node id: 1 statement: BEGIN;SELECT 1;FOO;
+ERROR: syntax error at or near "FOO"
+LINE 1: BEGIN;SELECT 1;FOO;
+ ^
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE: DB node id: 1 statement: SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
--- /dev/null
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE: DB node id: 1 statement: SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+NOTICE: DB node id: 0 statement: BEGIN;SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- ordinary read only SELECT: load balance expected
+SELECT 2;
+NOTICE: DB node id: 1 statement: SELECT 2;
+ ?column?
+----------
+ 2
+(1 row)
+
+-- tx started by multi-statement query ends
+END;
+NOTICE: DB node id: 0 statement: END;
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+NOTICE: DB node id: 0 statement: BEGIN;SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- 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;
+-- 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 ROLLBACK
+BEGIN\;SELECT 1\;ROLLBACK;
+NOTICE: DB node id: 0 statement: BEGIN;SELECT 1;ROLLBACK;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE: DB node id: 1 statement: SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- multi-statement query including BEGIN and invalid query
+BEGIN\;SELECT 1\;FOO;
+NOTICE: DB node id: 0 statement: BEGIN;SELECT 1;FOO;
+ERROR: syntax error at or near "FOO"
+LINE 1: BEGIN;SELECT 1;FOO;
+ ^
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE: DB node id: 1 statement: SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
--- /dev/null
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE: DB node id: 0 statement: SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+NOTICE: DB node id: 1 statement: BEGIN;SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- ordinary read only SELECT: load balance expected
+SELECT 2;
+NOTICE: DB node id: 0 statement: SELECT 2;
+ ?column?
+----------
+ 2
+(1 row)
+
+-- tx started by multi-statement query ends
+END;
+NOTICE: DB node id: 1 statement: END;
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+NOTICE: DB node id: 1 statement: BEGIN;SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- 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;
+-- 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 ROLLBACK
+BEGIN\;SELECT 1\;ROLLBACK;
+NOTICE: DB node id: 1 statement: BEGIN;SELECT 1;ROLLBACK;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE: DB node id: 0 statement: SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
+-- multi-statement query including BEGIN and invalid query
+BEGIN\;SELECT 1\;FOO;
+NOTICE: DB node id: 1 statement: BEGIN;SELECT 1;FOO;
+ERROR: syntax error at or near "FOO"
+LINE 1: BEGIN;SELECT 1;FOO;
+ ^
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+NOTICE: DB node id: 0 statement: SELECT 1;
+ ?column?
+----------
+ 1
+(1 row)
+
--- /dev/null
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 1;
+-- ordinary read only SELECT: load balance expected
+SELECT 2;
+-- tx started by multi-statement query ends
+END;
+-- multi-statement query including BEGIN
+BEGIN\;SELECT 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
+SELECT 1;
+-- multi-statement query including BEGIN and invalid query
+BEGIN\;SELECT 1\;FOO;
+-- ordinary read only SELECT: load balance expected
+SELECT 1;
source $TESTLIBS
TESTDIR=testdir
PSQL=$PGBIN/psql
+PSQLOPTS="-a -q -X"
+PGPOOLBIN=$PGPOOL_INSTALL_DIR/bin
+export PGDATABASE=test
# sleep time after reload in seconds
st=10
wait_for_pgpool_startup
- $PSQL -ae test > result1 2>&1 <<EOF
+ $PSQL $PSQLOPTS > result1 2>&1 <<EOF
CREATE TABLE t1(i INTEGER);
CREATE TABLE t2(i INTEGER);
CREATE FUNCTION f1(INTEGER) returns INTEGER AS 'SELECT \$1' LANGUAGE SQL;
./pgpool_reload
sleep $st
- $PSQL -ae test > result2 2>&1 <<EOF
+ $PSQL $PSQLOPTS > result2 2>&1 <<EOF
SELECT f1(1); -- this does load balance
SELECT public.f2(1); -- this does load balance
EOF
./startall
wait_for_pgpool_startup
- $PSQL -ae test > result3 2>&1 <<EOF
+ $PSQL $PSQLOPTS > result3 2>&1 <<EOF
SELECT * FROM t1;
SELECT 'a';
SELECT 1;
./startall
wait_for_pgpool_startup
- $PSQL -ae test > result4 2>&1 <<EOF
+ $PSQL $PSQLOPTS > result4 2>&1 <<EOF
BEGIN;
SELECT 1;
END;
echo "read_only_function_list = ''" >> etc/pgpool.conf
./pgpool_reload
sleep $st
- $PSQL -ae test > result5 2>&1 <<EOF
+ $PSQL $PSQLOPTS > result5 2>&1 <<EOF
SELECT f1(2); -- this should be sent to all the nodes
EOF
check_result 5
./pgpool_reload
sleep $st
- $PSQL -ae test > result6 2>&1 <<EOF
+ $PSQL $PSQLOPTS > result6 2>&1 <<EOF
SELECT f1(1);
SELECT public.f2(1);
EOF
check_result 6
+ echo "=== test7 started ==="
+# -------------------------------------------------------------------------------
+# multi statement queries
+# -------------------------------------------------------------------------------
+ echo "statement_level_load_balance = off" >> etc/pgpool.conf
+ # XXX primary_routing_query_pattern_list does not allow to overwritten.
+ # So following does not work.
+ #echo "primary_routing_query_pattern_list = ''" >> etc/pgpool.conf
+ sed -i '/^primary_routing_query_pattern_list/d' etc/pgpool.conf
+ #echo "log_min_messages = debug5" >> etc/pgpool.conf
+
./shutdownall
+ ./startall
+ wait_for_pgpool_startup
+ $PSQL -c "SHOW POOL_NODES;" test
- cd ..
+ $PSQL $PSQLOPTS < ../sql/7.sql > result7 2>&1
+ check_result 7
+
+ echo "=== test8 started ==="
+# -------------------------------------------------------------------------------
+# multi statement queries (swapping primary and standby)
+# -------------------------------------------------------------------------------
+ if [ $mode = 's' ];then
+ echo $PGPOOLBIN/pcp_promote_node -w -p $PCP_PORT --switchover 1
+ $PGPOOLBIN/pcp_promote_node -w -p $PCP_PORT --switchover 1
+ while :
+ do
+ wait_for_pgpool_startup
+ $PSQL -c "SHOW POOL_NODES;" test | grep down
+ if [ $? != 0 ];then
+ break
+ fi
+ sleep 1
+ done
+
+ # Swap the weights. Now backend 0 is the load balance node
+ echo "backend_weight0 = 1" >> etc/pgpool.conf
+ echo "backend_weight1 = 0" >> etc/pgpool.conf
+ ./shutdownall
+ ./startall
+ wait_for_pgpool_startup
+ $PSQL $PSQLOPTS < ../sql/7.sql > result8 2>&1
+ check_result 8
+ fi
+ ./shutdownall
+ cd ..
done
exit 0