Repository: incubator-hawq
Updated Branches:
  refs/heads/master 706882c20 -> 01a44739b


HAWQ-869. Add regression test for less tuple is inserted issue in prepared 
statement


Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/01a44739
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/01a44739
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/01a44739

Branch: refs/heads/master
Commit: 01a44739b0a701fc8b81ed91fdda52e618ef6b37
Parents: 706882c
Author: Ruilong Huo <r...@pivotal.io>
Authored: Mon Jun 27 16:04:46 2016 +0800
Committer: Ruilong Huo <r...@pivotal.io>
Committed: Wed Jun 29 10:28:13 2016 +0800

----------------------------------------------------------------------
 .../PreparedStatement/TestPreparedStatement.cpp |  38 +++
 .../feature/PreparedStatement/ans/insert.ans    | 266 +++++++++++++++++++
 .../feature/PreparedStatement/ans/proba.ans     | 230 ++++++++++++++++
 .../PreparedStatement/ans/proba_execute.ans     | 228 ++++++++++++++++
 .../feature/PreparedStatement/sql/insert.sql    | 130 +++++++++
 .../feature/PreparedStatement/sql/proba.sql     | 147 ++++++++++
 .../PreparedStatement/sql/proba_execute.sql     | 145 ++++++++++
 7 files changed, 1184 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/01a44739/src/test/feature/PreparedStatement/TestPreparedStatement.cpp
----------------------------------------------------------------------
diff --git a/src/test/feature/PreparedStatement/TestPreparedStatement.cpp 
b/src/test/feature/PreparedStatement/TestPreparedStatement.cpp
new file mode 100755
index 0000000..a8684ca
--- /dev/null
+++ b/src/test/feature/PreparedStatement/TestPreparedStatement.cpp
@@ -0,0 +1,38 @@
+#include "gtest/gtest.h"
+
+#include "lib/sql_util.h"
+
+
+class TestPreparedStatement: public ::testing::Test
+{
+       public:
+               TestPreparedStatement() {}
+               ~TestPreparedStatement() {}
+};
+
+// HAWQ-800: https://issues.apache.org/jira/browse/HAWQ-800
+// HAWQ-835: https://issues.apache.org/jira/browse/HAWQ-835
+TEST_F(TestPreparedStatement, TestPreparedStatementPrepare)
+{
+       hawq::test::SQLUtility util;
+       util.execSQLFile("PreparedStatement/sql/proba.sql",
+                        "PreparedStatement/ans/proba.ans");
+}
+
+// HAWQ-800: https://issues.apache.org/jira/browse/HAWQ-800
+// HAWQ-835: https://issues.apache.org/jira/browse/HAWQ-835
+TEST_F(TestPreparedStatement, TestPreparedStatementExecute)
+{
+       hawq::test::SQLUtility util;
+       util.execSQLFile("PreparedStatement/sql/proba_execute.sql",
+                        "PreparedStatement/ans/proba_execute.ans");
+}
+
+// HAWQ-800: https://issues.apache.org/jira/browse/HAWQ-800
+// HAWQ-835: https://issues.apache.org/jira/browse/HAWQ-835
+TEST_F(TestPreparedStatement, TestPreparedStatementInsert)
+{
+       hawq::test::SQLUtility util;
+       util.execSQLFile("PreparedStatement/sql/insert.sql",
+                        "PreparedStatement/ans/insert.ans");
+}

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/01a44739/src/test/feature/PreparedStatement/ans/insert.ans
----------------------------------------------------------------------
diff --git a/src/test/feature/PreparedStatement/ans/insert.ans 
b/src/test/feature/PreparedStatement/ans/insert.ans
new file mode 100644
index 0000000..32b2f4f
--- /dev/null
+++ b/src/test/feature/PreparedStatement/ans/insert.ans
@@ -0,0 +1,266 @@
+-- start_ignore
+SET SEARCH_PATH=TestPreparedStatement_TestPreparedStatementInsert;
+SET
+-- end_ignore
+-- start_ignore
+drop function if exists f1();
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:5: NOTICE:  
function f1() does not exist, skipping
+DROP FUNCTION
+drop function if exists f2();
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:6: NOTICE:  
function f2() does not exist, skipping
+DROP FUNCTION
+drop table if exists t1;
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:7: NOTICE:  
table "t1" does not exist, skipping
+DROP TABLE
+drop table if exists t2;
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:8: NOTICE:  
table "t2" does not exist, skipping
+DROP TABLE
+-- end_ignore
+create table t1 (id int);
+CREATE TABLE
+insert into t1 values (1);
+INSERT 0 1
+create table t2 (id int);
+CREATE TABLE
+CREATE OR REPLACE FUNCTION f1()
+  RETURNS text
+  LANGUAGE plpgsql
+AS
+$body$
+DECLARE
+    l_rec record;
+    l_item record;
+       l_count integer;
+BEGIN
+
+       RAISE NOTICE '--- Initial content of t1: begin ---';
+       SELECT count(*) INTO l_count FROM t1;
+       RAISE NOTICE '--- # tuple: %', l_count;
+    RAISE NOTICE 'id';
+    FOR l_item IN SELECT * FROM t1 LOOP
+        RAISE NOTICE '%', quote_ident(l_item.id);
+    END LOOP;
+       RAISE NOTICE '--- Initial content of t1: end ---';
+
+    FOR l_rec IN ( SELECT generate_series(1, 3) AS idx )
+    LOOP
+        INSERT INTO t1 SELECT * FROM t1;
+
+           RAISE NOTICE '--- Content of t1 after %d insert in loop: begin 
---', l_rec.idx;
+               SELECT count(*) INTO l_count FROM t1;
+               RAISE NOTICE '--- # tuple: %', l_count;
+        RAISE NOTICE 'id';
+        FOR l_item IN SELECT * FROM t1 LOOP
+            RAISE NOTICE '%', quote_ident(l_item.id);
+        END LOOP;
+           RAISE NOTICE '--- Content of t1 after %d insert in loop: end ---', 
l_rec.idx;
+    END LOOP;
+
+       RAISE NOTICE '--- Final content of t1: begin ---';
+       SELECT count(*) INTO l_count FROM t1;
+       RAISE NOTICE '--- # tuple: %', l_count;
+    RAISE NOTICE 'id';
+    FOR l_item IN SELECT * FROM t1 LOOP
+        RAISE NOTICE '%', quote_ident(l_item.id);
+    END LOOP;
+       RAISE NOTICE '--- Final content of t1: end ---';
+
+    RETURN 'done';
+END
+$body$
+;
+CREATE FUNCTION
+CREATE OR REPLACE FUNCTION f2()
+  RETURNS text
+  LANGUAGE plpgsql
+AS
+$body$
+DECLARE
+    l_rec record;
+    l_item record;
+       l_count integer;
+BEGIN
+       RAISE NOTICE '--- Initial content of t2: begin ---';
+       SELECT count(*) INTO l_count FROM t2;
+       RAISE NOTICE '--- # tuple: %', l_count;
+    RAISE NOTICE 'id';
+    FOR l_item IN SELECT * FROM t2 LOOP
+        RAISE NOTICE '%', quote_ident(l_item.id);
+    END LOOP;
+       RAISE NOTICE '--- Initial content of t2: end ---';
+
+       insert into t2 values (1);
+
+       RAISE NOTICE '--- Content of t2 after seed data inserted: begin ---';
+       SELECT count(*) INTO l_count FROM t2;
+       RAISE NOTICE '--- # tuple: %', l_count;
+    RAISE NOTICE 'id';
+    FOR l_item IN SELECT * FROM t2 LOOP
+        RAISE NOTICE '%', quote_ident(l_item.id);
+    END LOOP;
+       RAISE NOTICE '--- Content of t2 after seed data inserted: end ---';
+
+    FOR l_rec IN ( SELECT generate_series(1, 3) AS idx )
+    LOOP
+        INSERT INTO t2 SELECT * FROM t2;
+
+           RAISE NOTICE '--- Content of t2 after %d insert in loop: begin 
---', l_rec.idx;
+               SELECT count(*) INTO l_count FROM t2;
+               RAISE NOTICE '--- # tuple: %', l_count;
+        RAISE NOTICE 'id';
+        FOR l_item IN SELECT * FROM t2 LOOP
+            RAISE NOTICE '%', quote_ident(l_item.id);
+        END LOOP;
+           RAISE NOTICE '--- Content of t2 after %d insert in loop: end ---', 
l_rec.idx;
+    END LOOP;
+
+       RAISE NOTICE '--- Final content of t2: begin ---';
+       SELECT count(*) INTO l_count FROM t2;
+       RAISE NOTICE '--- # tuple: %', l_count;
+    RAISE NOTICE 'id';
+    FOR l_item IN SELECT * FROM t2 LOOP
+        RAISE NOTICE '%', quote_ident(l_item.id);
+    END LOOP;
+       RAISE NOTICE '--- Final content of t2: end ---';
+
+    RETURN 'done';
+END
+$body$
+;
+CREATE FUNCTION
+select f1();
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- Initial content of t1: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- # tuple: 1
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
id
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- Initial content of t1: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- Content of t1 after 1d insert in loop: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- # tuple: 2
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
id
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- Content of t1 after 1d insert in loop: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- Content of t1 after 2d insert in loop: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- # tuple: 4
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
id
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- Content of t1 after 2d insert in loop: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- Content of t1 after 3d insert in loop: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- # tuple: 8
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
id
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- Content of t1 after 3d insert in loop: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- Final content of t1: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- # tuple: 8
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
id
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:122: NOTICE:  
--- Final content of t1: end ---
+  f1  
+------
+ done
+(1 row)
+
+select f2();
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- Initial content of t2: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- # tuple: 0
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
id
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- Initial content of t2: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- Content of t2 after seed data inserted: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- # tuple: 1
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
id
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- Content of t2 after seed data inserted: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- Content of t2 after 1d insert in loop: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- # tuple: 2
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
id
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- Content of t2 after 1d insert in loop: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- Content of t2 after 2d insert in loop: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- # tuple: 4
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
id
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- Content of t2 after 2d insert in loop: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- Content of t2 after 3d insert in loop: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- # tuple: 8
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
id
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- Content of t2 after 3d insert in loop: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- Final content of t2: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- # tuple: 8
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
id
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
"1"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementInsert.sql:124: NOTICE:  
--- Final content of t2: end ---
+  f2  
+------
+ done
+(1 row)
+
+select * from t1;
+ id 
+----
+  1
+  1
+  1
+  1
+  1
+  1
+  1
+  1
+(8 rows)
+
+select * from t2;
+ id 
+----
+  1
+  1
+  1
+  1
+  1
+  1
+  1
+  1
+(8 rows)
+
+drop function if exists f1();
+DROP FUNCTION
+drop function if exists f2();
+DROP FUNCTION
+drop table if exists t1;
+DROP TABLE
+drop table if exists t2;
+DROP TABLE

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/01a44739/src/test/feature/PreparedStatement/ans/proba.ans
----------------------------------------------------------------------
diff --git a/src/test/feature/PreparedStatement/ans/proba.ans 
b/src/test/feature/PreparedStatement/ans/proba.ans
new file mode 100644
index 0000000..0e01005
--- /dev/null
+++ b/src/test/feature/PreparedStatement/ans/proba.ans
@@ -0,0 +1,230 @@
+-- start_ignore
+SET SEARCH_PATH=TestPreparedStatement_TestPreparedStatementPrepare;
+SET
+-- end_ignore
+-- start_ignore
+drop function if exists f_load();
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:5: NOTICE:  
function f_load() does not exist, skipping
+DROP FUNCTION
+drop table if exists src_table;
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:6: NOTICE:  
table "src_table" does not exist, skipping
+DROP TABLE
+drop table if exists main_table;
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:7: NOTICE:  
table "main_table" does not exist, skipping
+DROP TABLE
+drop table if exists map_table;
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:8: NOTICE:  
table "map_table" does not exist, skipping
+DROP TABLE
+-- end_ignore
+create table src_table ( id_natural integer, value varchar, id_file int);
+CREATE TABLE
+create table main_table (id_auto integer, id_natural integer, value varchar, 
record_type varchar, id_file integer);
+CREATE TABLE
+create table map_table (id_auto integer, id_natural integer);
+CREATE TABLE
+insert into src_table values ( 1, 'sth',      10);
+INSERT 0 1
+insert into src_table values ( 1, 'sht else', 11);
+INSERT 0 1
+CREATE OR REPLACE FUNCTION f_load()
+  RETURNS text
+  LANGUAGE plpgsql
+AS
+$body$
+DECLARE
+
+   l_count integer:=0;
+   l_rec record;
+   l_tuple integer;
+   l_item record;
+
+BEGIN
+
+       RAISE NOTICE '--- Initial content of main_table: begin ---';
+    RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+    FOR l_item IN SELECT * FROM main_table LOOP
+        RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+    END LOOP;
+       RAISE NOTICE '--- Initial content of main_table: end ---';
+
+    INSERT INTO main_table
+         ( id_natural
+         , value
+         , record_type
+         , id_file
+         )
+    SELECT id_natural
+         , value
+         , 'P'
+         , id_file
+      FROM src_table;
+
+    GET DIAGNOSTICS l_tuple = ROW_COUNT;
+    RAISE NOTICE 'INSERT INTO main_table with seed data from src_table: % 
tuple inserted', l_tuple;
+
+       RAISE NOTICE '--- Content of main_table after seed data inserted: begin 
---';
+    RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+    FOR l_item IN SELECT * FROM main_table LOOP
+        RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+    END LOOP;
+       RAISE NOTICE '--- Content of main_table after seed data inserted: end 
---';
+
+FOR l_rec IN ( select id_file from main_table group by id_file order by 1)
+  LOOP
+      l_count:=l_count+1;
+
+      INSERT INTO main_table
+           ( id_natural
+           , value
+           , record_type
+           , id_file
+           )
+      SELECT id_natural
+           , value
+           , 'N'
+           , l_rec.id_file
+        FROM main_table pxf
+       WHERE pxf.id_file=l_rec.id_file AND pxf.record_type='P'
+           ;
+
+      GET DIAGNOSTICS l_tuple = ROW_COUNT;
+      RAISE NOTICE 'Insert into main_table in loop % with first insert 
statement: % tuple inserted', l_count, l_tuple;
+
+         RAISE NOTICE '--- Content of main_table after loop % with first 
insert statement: begin ---', l_count;
+      RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+      FOR l_item IN SELECT * FROM main_table LOOP
+          RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+      END LOOP;
+         RAISE NOTICE '--- Content of main_table after loop % with first 
insert statement: end ---', l_count;
+
+      INSERT INTO main_table
+           ( id_auto
+           , id_natural
+           , value
+           , record_type
+           , id_file
+           )
+      SELECT l_count
+           , ma.id_natural
+           , value
+           , CASE WHEN mt.id_natural IS NULL THEN 'I' ELSE 'U' END AS 
record_type
+           , id_file
+        FROM main_table ma
+        LEFT JOIN map_table mt on mt.id_natural=ma.id_natural
+       WHERE ma.record_type='N' AND ma.id_file=l_rec.id_file
+           ;
+
+      GET DIAGNOSTICS l_tuple = ROW_COUNT;
+      RAISE NOTICE 'Insert into main_table in loop % with second insert 
statement: % tuple inserted', l_count, l_tuple;
+
+         RAISE NOTICE '--- Content of main_table after loop % with second 
insert statement: begin ---', l_count;
+      RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+      FOR l_item IN SELECT * FROM main_table LOOP
+          RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+      END LOOP;
+         RAISE NOTICE '--- Content of main_table after loop % with second 
insert statement: end ---', l_count;
+
+      execute 'truncate table map_table';
+
+      INSERT INTO map_table
+           ( id_auto
+           , id_natural
+           )
+      SELECT ma.id_auto
+           , ma.id_natural
+        FROM main_table ma
+       WHERE record_type NOT IN ('N','P') AND id_file=l_rec.id_file
+           ;
+
+     END LOOP;
+
+        RAISE NOTICE '--- Final content of main_table: begin ---';
+     RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+     FOR l_item IN SELECT * FROM main_table LOOP
+         RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+     END LOOP;
+        RAISE NOTICE '--- Final content of main_table: end ---';
+
+  RETURN 'done';
+
+END;
+$body$
+;
+CREATE FUNCTION
+select f_load();
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Initial content of main_table: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Initial content of main_table: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
INSERT INTO main_table with seed data from src_table: 2 tuple inserted
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Content of main_table after seed data inserted: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", sth, "P", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", "sht else", "P", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Content of main_table after seed data inserted: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
Insert into main_table in loop 1 with first insert statement: 1 tuple inserted
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Content of main_table after loop 1 with first insert statement: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", sth, "P", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", "sht else", "P", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", sth, "N", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Content of main_table after loop 1 with first insert statement: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
Insert into main_table in loop 1 with second insert statement: 1 tuple inserted
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Content of main_table after loop 1 with second insert statement: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", "sht else", "P", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", sth, "N", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", sth, "P", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
"1", "1", sth, "I", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Content of main_table after loop 1 with second insert statement: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
Insert into main_table in loop 2 with first insert statement: 1 tuple inserted
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Content of main_table after loop 2 with first insert statement: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
"1", "1", sth, "I", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", sth, "P", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", "sht else", "P", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", sth, "N", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", "sht else", "N", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Content of main_table after loop 2 with first insert statement: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
Insert into main_table in loop 2 with second insert statement: 1 tuple inserted
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Content of main_table after loop 2 with second insert statement: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", sth, "P", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", "sht else", "P", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", sth, "N", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", "sht else", "N", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
"1", "1", sth, "I", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
"2", "1", "sht else", "U", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Content of main_table after loop 2 with second insert statement: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Final content of main_table: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
"2", "1", "sht else", "U", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", sth, "P", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
"1", "1", sth, "I", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", "sht else", "P", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", sth, "N", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
<NULL>, "1", "sht else", "N", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementPrepare.sql:143: NOTICE:  
--- Final content of main_table: end ---
+ f_load 
+--------
+ done
+(1 row)
+
+select * from main_table;
+ id_auto | id_natural |  value   | record_type | id_file 
+---------+------------+----------+-------------+---------
+       1 |          1 | sth      | I           |      10
+       2 |          1 | sht else | U           |      11
+         |          1 | sht else | P           |      11
+         |          1 | sth      | N           |      10
+         |          1 | sht else | N           |      11
+         |          1 | sth      | P           |      10
+(6 rows)
+
+drop function if exists f_load();
+DROP FUNCTION
+drop table if exists src_table;
+DROP TABLE
+drop table if exists main_table;
+DROP TABLE
+drop table if exists map_table;
+DROP TABLE

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/01a44739/src/test/feature/PreparedStatement/ans/proba_execute.ans
----------------------------------------------------------------------
diff --git a/src/test/feature/PreparedStatement/ans/proba_execute.ans 
b/src/test/feature/PreparedStatement/ans/proba_execute.ans
new file mode 100644
index 0000000..853a092
--- /dev/null
+++ b/src/test/feature/PreparedStatement/ans/proba_execute.ans
@@ -0,0 +1,228 @@
+-- start_ignore
+SET SEARCH_PATH=TestPreparedStatement_TestPreparedStatementExecute;
+SET
+-- end_ignore
+drop function if exists f_load_exe();
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:4: NOTICE:  
function f_load_exe() does not exist, skipping
+DROP FUNCTION
+drop table if exists src_table_exe;
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:5: NOTICE:  
table "src_table_exe" does not exist, skipping
+DROP TABLE
+drop table if exists main_table_exe;
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:6: NOTICE:  
table "main_table_exe" does not exist, skipping
+DROP TABLE
+drop table if exists map_table_exe;
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:7: NOTICE:  
table "map_table_exe" does not exist, skipping
+DROP TABLE
+create table src_table_exe ( id_natural integer, value varchar, id_file int);
+CREATE TABLE
+create table main_table_exe (id_auto integer, id_natural integer, value 
varchar, record_type varchar, id_file integer);
+CREATE TABLE
+create table map_table_exe (id_auto integer, id_natural integer);
+CREATE TABLE
+insert into src_table_exe values ( 1, 'sth',        10);
+INSERT 0 1
+insert into src_table_exe values ( 1, 'sht else', 11);
+INSERT 0 1
+CREATE OR REPLACE FUNCTION f_load_exe()
+  RETURNS text
+  LANGUAGE plpgsql
+AS
+$body$
+DECLARE
+
+   l_count integer:=0;
+   l_rec record;
+   l_tuple integer;
+   l_item record;
+
+BEGIN
+
+RAISE NOTICE '--- Initial content of main_table_exe: begin ---';
+RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+FOR l_item IN SELECT * FROM main_table_exe LOOP
+    RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+END LOOP;
+RAISE NOTICE '--- Initial content of main_table_exe: end ---';
+
+execute 'INSERT INTO main_table_exe
+              ( id_natural
+              , value
+              , record_type
+              , id_file
+              )
+         SELECT id_natural
+              , value
+              , ''P''
+              , id_file
+           FROM src_table_exe';
+
+GET DIAGNOSTICS l_tuple = ROW_COUNT;
+RAISE NOTICE 'INSERT INTO main_table_exe with seed data from src_table_exe: % 
tuple inserted', l_tuple;
+
+RAISE NOTICE '--- Content of main_table_exe after seed data inserted: begin 
---';
+RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+FOR l_item IN SELECT * FROM main_table_exe LOOP
+    RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+END LOOP;
+RAISE NOTICE '--- Content of main_table_exe after seed data inserted: end ---';
+
+FOR l_rec IN ( select id_file from main_table_exe group by id_file order by 1)
+  LOOP
+      l_count:=l_count+1;
+
+execute 'INSERT INTO main_table_exe
+              ( id_natural
+              , value
+              , record_type
+              , id_file
+              )
+         SELECT id_natural
+              , value
+              , ''N''
+              , '||l_rec.id_file||'
+           FROM main_table_exe pxf
+          WHERE pxf.id_file='||l_rec.id_file||' AND pxf.record_type=''P'''
+              ;
+
+GET DIAGNOSTICS l_tuple = ROW_COUNT;
+RAISE NOTICE 'Insert into main_table_exe in loop % with first insert 
statement: % tuple inserted', l_count, l_tuple;
+
+RAISE NOTICE '--- Content of main_table_exe after loop % with first insert 
statement: begin ---', l_count;
+RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+FOR l_item IN SELECT * FROM main_table_exe LOOP
+    RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+END LOOP;
+RAISE NOTICE '--- Content of main_table_exe after loop % with first insert 
statement: end ---', l_count;
+
+execute 'INSERT INTO main_table_exe
+              ( id_auto
+              , id_natural
+              , value
+              , record_type
+              , id_file
+              )
+         SELECT '||l_count||'
+              , ma.id_natural
+              , value
+              , CASE WHEN mt.id_natural IS NULL THEN ''I'' ELSE ''U'' END AS 
record_type
+              , id_file
+           FROM main_table_exe ma
+           LEFT JOIN map_table_exe mt on mt.id_natural=ma.id_natural
+          WHERE ma.record_type=''N'' AND ma.id_file='||l_rec.id_file
+              ;
+
+        execute 'truncate table map_table_exe';
+
+GET DIAGNOSTICS l_tuple = ROW_COUNT;
+RAISE NOTICE 'Insert into main_table_exe in loop % with second insert 
statement: % tuple inserted', l_count, l_tuple;
+
+RAISE NOTICE '--- Content of main_table_exe after loop % with second insert 
statement: begin ---', l_count;
+RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+FOR l_item IN SELECT * FROM main_table_exe LOOP
+    RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+END LOOP;
+RAISE NOTICE '--- Content of main_table_exe after loop % with second insert 
statement: end ---', l_count;
+
+execute 'INSERT INTO map_table_exe
+              ( id_auto
+              , id_natural
+              )
+         SELECT ma.id_auto
+              , ma.id_natural
+           FROM main_table_exe ma
+          WHERE record_type NOT IN (''N'',''P'') AND id_file='||l_rec.id_file
+              ;
+
+     END LOOP;
+
+RAISE NOTICE '--- Final content of main_table_exe: begin ---';
+RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+FOR l_item IN SELECT * FROM main_table_exe LOOP
+    RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+END LOOP;
+RAISE NOTICE '--- Final content of main_table_exe: end ---';
+
+  RETURN 'done';
+
+END;
+$body$
+;
+CREATE FUNCTION
+select f_load_exe();
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Initial content of main_table_exe: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Initial content of main_table_exe: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
INSERT INTO main_table_exe with seed data from src_table_exe: 2 tuple inserted
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Content of main_table_exe after seed data inserted: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", sth, "P", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", "sht else", "P", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Content of main_table_exe after seed data inserted: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
Insert into main_table_exe in loop 1 with first insert statement: 1 tuple 
inserted
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Content of main_table_exe after loop 1 with first insert statement: begin 
---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", sth, "P", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", "sht else", "P", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", sth, "N", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Content of main_table_exe after loop 1 with first insert statement: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
Insert into main_table_exe in loop 1 with second insert statement: 0 tuple 
inserted
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Content of main_table_exe after loop 1 with second insert statement: begin 
---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", "sht else", "P", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", sth, "P", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", sth, "N", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
"1", "1", sth, "I", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Content of main_table_exe after loop 1 with second insert statement: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
Insert into main_table_exe in loop 2 with first insert statement: 1 tuple 
inserted
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Content of main_table_exe after loop 2 with first insert statement: begin 
---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", sth, "P", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", "sht else", "P", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", sth, "N", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
"1", "1", sth, "I", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", "sht else", "N", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Content of main_table_exe after loop 2 with first insert statement: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
Insert into main_table_exe in loop 2 with second insert statement: 0 tuple 
inserted
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Content of main_table_exe after loop 2 with second insert statement: begin 
---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", sth, "N", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
"1", "1", sth, "I", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", "sht else", "N", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", "sht else", "P", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", sth, "P", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
"2", "1", "sht else", "U", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Content of main_table_exe after loop 2 with second insert statement: end ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Final content of main_table_exe: begin ---
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
id_auto, id_natural, value, record_type, id_file
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", sth, "P", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
"2", "1", "sht else", "U", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", "sht else", "P", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
"1", "1", sth, "I", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", "sht else", "N", "11"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
<NULL>, "1", sth, "N", "10"
+psql:/tmp/TestPreparedStatement_TestPreparedStatementExecute.sql:141: NOTICE:  
--- Final content of main_table_exe: end ---
+ f_load_exe 
+------------
+ done
+(1 row)
+
+select * from main_table_exe;
+ id_auto | id_natural |  value   | record_type | id_file 
+---------+------------+----------+-------------+---------
+         |          1 | sht else | P           |      11
+         |          1 | sth      | P           |      10
+       2 |          1 | sht else | U           |      11
+         |          1 | sth      | N           |      10
+       1 |          1 | sth      | I           |      10
+         |          1 | sht else | N           |      11
+(6 rows)
+
+drop function if exists f_load_exe();
+DROP FUNCTION
+drop table if exists src_table_exe;
+DROP TABLE
+drop table if exists main_table_exe;
+DROP TABLE
+drop table if exists map_table_exe;
+DROP TABLE

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/01a44739/src/test/feature/PreparedStatement/sql/insert.sql
----------------------------------------------------------------------
diff --git a/src/test/feature/PreparedStatement/sql/insert.sql 
b/src/test/feature/PreparedStatement/sql/insert.sql
new file mode 100644
index 0000000..01867c0
--- /dev/null
+++ b/src/test/feature/PreparedStatement/sql/insert.sql
@@ -0,0 +1,130 @@
+-- start_ignore
+drop function if exists f1();
+drop function if exists f2();
+drop table if exists t1;
+drop table if exists t2;
+-- end_ignore
+
+create table t1 (id int);
+insert into t1 values (1);
+
+create table t2 (id int);
+
+CREATE OR REPLACE FUNCTION f1()
+  RETURNS text
+  LANGUAGE plpgsql
+AS
+$body$
+DECLARE
+    l_rec record;
+    l_item record;
+       l_count integer;
+BEGIN
+
+       RAISE NOTICE '--- Initial content of t1: begin ---';
+       SELECT count(*) INTO l_count FROM t1;
+       RAISE NOTICE '--- # tuple: %', l_count;
+    RAISE NOTICE 'id';
+    FOR l_item IN SELECT * FROM t1 LOOP
+        RAISE NOTICE '%', quote_ident(l_item.id);
+    END LOOP;
+       RAISE NOTICE '--- Initial content of t1: end ---';
+
+    FOR l_rec IN ( SELECT generate_series(1, 3) AS idx )
+    LOOP
+        INSERT INTO t1 SELECT * FROM t1;
+
+           RAISE NOTICE '--- Content of t1 after %d insert in loop: begin 
---', l_rec.idx;
+               SELECT count(*) INTO l_count FROM t1;
+               RAISE NOTICE '--- # tuple: %', l_count;
+        RAISE NOTICE 'id';
+        FOR l_item IN SELECT * FROM t1 LOOP
+            RAISE NOTICE '%', quote_ident(l_item.id);
+        END LOOP;
+           RAISE NOTICE '--- Content of t1 after %d insert in loop: end ---', 
l_rec.idx;
+    END LOOP;
+
+       RAISE NOTICE '--- Final content of t1: begin ---';
+       SELECT count(*) INTO l_count FROM t1;
+       RAISE NOTICE '--- # tuple: %', l_count;
+    RAISE NOTICE 'id';
+    FOR l_item IN SELECT * FROM t1 LOOP
+        RAISE NOTICE '%', quote_ident(l_item.id);
+    END LOOP;
+       RAISE NOTICE '--- Final content of t1: end ---';
+
+    RETURN 'done';
+END
+$body$
+;
+
+CREATE OR REPLACE FUNCTION f2()
+  RETURNS text
+  LANGUAGE plpgsql
+AS
+$body$
+DECLARE
+    l_rec record;
+    l_item record;
+       l_count integer;
+BEGIN
+       RAISE NOTICE '--- Initial content of t2: begin ---';
+       SELECT count(*) INTO l_count FROM t2;
+       RAISE NOTICE '--- # tuple: %', l_count;
+    RAISE NOTICE 'id';
+    FOR l_item IN SELECT * FROM t2 LOOP
+        RAISE NOTICE '%', quote_ident(l_item.id);
+    END LOOP;
+       RAISE NOTICE '--- Initial content of t2: end ---';
+
+       insert into t2 values (1);
+
+       RAISE NOTICE '--- Content of t2 after seed data inserted: begin ---';
+       SELECT count(*) INTO l_count FROM t2;
+       RAISE NOTICE '--- # tuple: %', l_count;
+    RAISE NOTICE 'id';
+    FOR l_item IN SELECT * FROM t2 LOOP
+        RAISE NOTICE '%', quote_ident(l_item.id);
+    END LOOP;
+       RAISE NOTICE '--- Content of t2 after seed data inserted: end ---';
+
+    FOR l_rec IN ( SELECT generate_series(1, 3) AS idx )
+    LOOP
+        INSERT INTO t2 SELECT * FROM t2;
+
+           RAISE NOTICE '--- Content of t2 after %d insert in loop: begin 
---', l_rec.idx;
+               SELECT count(*) INTO l_count FROM t2;
+               RAISE NOTICE '--- # tuple: %', l_count;
+        RAISE NOTICE 'id';
+        FOR l_item IN SELECT * FROM t2 LOOP
+            RAISE NOTICE '%', quote_ident(l_item.id);
+        END LOOP;
+           RAISE NOTICE '--- Content of t2 after %d insert in loop: end ---', 
l_rec.idx;
+    END LOOP;
+
+       RAISE NOTICE '--- Final content of t2: begin ---';
+       SELECT count(*) INTO l_count FROM t2;
+       RAISE NOTICE '--- # tuple: %', l_count;
+    RAISE NOTICE 'id';
+    FOR l_item IN SELECT * FROM t2 LOOP
+        RAISE NOTICE '%', quote_ident(l_item.id);
+    END LOOP;
+       RAISE NOTICE '--- Final content of t2: end ---';
+
+    RETURN 'done';
+END
+$body$
+;
+
+select f1();
+
+select f2();
+
+select * from t1;
+
+select * from t2;
+
+drop function if exists f1();
+drop function if exists f2();
+drop table if exists t1;
+drop table if exists t2;

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/01a44739/src/test/feature/PreparedStatement/sql/proba.sql
----------------------------------------------------------------------
diff --git a/src/test/feature/PreparedStatement/sql/proba.sql 
b/src/test/feature/PreparedStatement/sql/proba.sql
new file mode 100644
index 0000000..b9653a6
--- /dev/null
+++ b/src/test/feature/PreparedStatement/sql/proba.sql
@@ -0,0 +1,147 @@
+-- start_ignore
+drop function if exists f_load();
+drop table if exists src_table;
+drop table if exists main_table;
+drop table if exists map_table;
+-- end_ignore
+
+create table src_table ( id_natural integer, value varchar, id_file int);
+create table main_table (id_auto integer, id_natural integer, value varchar, 
record_type varchar, id_file integer);
+create table map_table (id_auto integer, id_natural integer);
+
+insert into src_table values ( 1, 'sth',      10);
+insert into src_table values ( 1, 'sht else', 11);
+
+CREATE OR REPLACE FUNCTION f_load()
+  RETURNS text
+  LANGUAGE plpgsql
+AS
+$body$
+DECLARE
+
+   l_count integer:=0;
+   l_rec record;
+   l_tuple integer;
+   l_item record;
+
+BEGIN
+
+       RAISE NOTICE '--- Initial content of main_table: begin ---';
+    RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+    FOR l_item IN SELECT * FROM main_table LOOP
+        RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+    END LOOP;
+       RAISE NOTICE '--- Initial content of main_table: end ---';
+
+    INSERT INTO main_table
+         ( id_natural
+         , value
+         , record_type
+         , id_file
+         )
+    SELECT id_natural
+         , value
+         , 'P'
+         , id_file
+      FROM src_table;
+
+    GET DIAGNOSTICS l_tuple = ROW_COUNT;
+    RAISE NOTICE 'INSERT INTO main_table with seed data from src_table: % 
tuple inserted', l_tuple;
+
+       RAISE NOTICE '--- Content of main_table after seed data inserted: begin 
---';
+    RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+    FOR l_item IN SELECT * FROM main_table LOOP
+        RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+    END LOOP;
+       RAISE NOTICE '--- Content of main_table after seed data inserted: end 
---';
+
+FOR l_rec IN ( select id_file from main_table group by id_file order by 1)
+  LOOP
+      l_count:=l_count+1;
+
+      INSERT INTO main_table
+           ( id_natural
+           , value
+           , record_type
+           , id_file
+           )
+      SELECT id_natural
+           , value
+           , 'N'
+           , l_rec.id_file
+        FROM main_table pxf
+       WHERE pxf.id_file=l_rec.id_file AND pxf.record_type='P'
+           ;
+
+      GET DIAGNOSTICS l_tuple = ROW_COUNT;
+      RAISE NOTICE 'Insert into main_table in loop % with first insert 
statement: % tuple inserted', l_count, l_tuple;
+
+         RAISE NOTICE '--- Content of main_table after loop % with first 
insert statement: begin ---', l_count;
+      RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+      FOR l_item IN SELECT * FROM main_table LOOP
+          RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+      END LOOP;
+         RAISE NOTICE '--- Content of main_table after loop % with first 
insert statement: end ---', l_count;
+
+      INSERT INTO main_table
+           ( id_auto
+           , id_natural
+           , value
+           , record_type
+           , id_file
+           )
+      SELECT l_count
+           , ma.id_natural
+           , value
+           , CASE WHEN mt.id_natural IS NULL THEN 'I' ELSE 'U' END AS 
record_type
+           , id_file
+        FROM main_table ma
+        LEFT JOIN map_table mt on mt.id_natural=ma.id_natural
+       WHERE ma.record_type='N' AND ma.id_file=l_rec.id_file
+           ;
+
+      GET DIAGNOSTICS l_tuple = ROW_COUNT;
+      RAISE NOTICE 'Insert into main_table in loop % with second insert 
statement: % tuple inserted', l_count, l_tuple;
+
+         RAISE NOTICE '--- Content of main_table after loop % with second 
insert statement: begin ---', l_count;
+      RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+      FOR l_item IN SELECT * FROM main_table LOOP
+          RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+      END LOOP;
+         RAISE NOTICE '--- Content of main_table after loop % with second 
insert statement: end ---', l_count;
+
+      execute 'truncate table map_table';
+
+      INSERT INTO map_table
+           ( id_auto
+           , id_natural
+           )
+      SELECT ma.id_auto
+           , ma.id_natural
+        FROM main_table ma
+       WHERE record_type NOT IN ('N','P') AND id_file=l_rec.id_file
+           ;
+
+     END LOOP;
+
+        RAISE NOTICE '--- Final content of main_table: begin ---';
+     RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+     FOR l_item IN SELECT * FROM main_table LOOP
+         RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+     END LOOP;
+        RAISE NOTICE '--- Final content of main_table: end ---';
+
+  RETURN 'done';
+
+END;
+$body$
+;
+
+select f_load();
+
+select * from main_table;
+
+drop function if exists f_load();
+drop table if exists src_table;
+drop table if exists main_table;
+drop table if exists map_table;

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/01a44739/src/test/feature/PreparedStatement/sql/proba_execute.sql
----------------------------------------------------------------------
diff --git a/src/test/feature/PreparedStatement/sql/proba_execute.sql 
b/src/test/feature/PreparedStatement/sql/proba_execute.sql
new file mode 100644
index 0000000..05625f3
--- /dev/null
+++ b/src/test/feature/PreparedStatement/sql/proba_execute.sql
@@ -0,0 +1,145 @@
+drop function if exists f_load_exe();
+drop table if exists src_table_exe;
+drop table if exists main_table_exe;
+drop table if exists map_table_exe;
+
+create table src_table_exe ( id_natural integer, value varchar, id_file int);
+create table main_table_exe (id_auto integer, id_natural integer, value 
varchar, record_type varchar, id_file integer);
+create table map_table_exe (id_auto integer, id_natural integer);
+
+insert into src_table_exe values ( 1, 'sth',        10);
+insert into src_table_exe values ( 1, 'sht else', 11);
+
+CREATE OR REPLACE FUNCTION f_load_exe()
+  RETURNS text
+  LANGUAGE plpgsql
+AS
+$body$
+DECLARE
+
+   l_count integer:=0;
+   l_rec record;
+   l_tuple integer;
+   l_item record;
+
+BEGIN
+
+RAISE NOTICE '--- Initial content of main_table_exe: begin ---';
+RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+FOR l_item IN SELECT * FROM main_table_exe LOOP
+    RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+END LOOP;
+RAISE NOTICE '--- Initial content of main_table_exe: end ---';
+
+execute 'INSERT INTO main_table_exe
+              ( id_natural
+              , value
+              , record_type
+              , id_file
+              )
+         SELECT id_natural
+              , value
+              , ''P''
+              , id_file
+           FROM src_table_exe';
+
+GET DIAGNOSTICS l_tuple = ROW_COUNT;
+RAISE NOTICE 'INSERT INTO main_table_exe with seed data from src_table_exe: % 
tuple inserted', l_tuple;
+
+RAISE NOTICE '--- Content of main_table_exe after seed data inserted: begin 
---';
+RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+FOR l_item IN SELECT * FROM main_table_exe LOOP
+    RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+END LOOP;
+RAISE NOTICE '--- Content of main_table_exe after seed data inserted: end ---';
+
+FOR l_rec IN ( select id_file from main_table_exe group by id_file order by 1)
+  LOOP
+      l_count:=l_count+1;
+
+execute 'INSERT INTO main_table_exe
+              ( id_natural
+              , value
+              , record_type
+              , id_file
+              )
+         SELECT id_natural
+              , value
+              , ''N''
+              , '||l_rec.id_file||'
+           FROM main_table_exe pxf
+          WHERE pxf.id_file='||l_rec.id_file||' AND pxf.record_type=''P'''
+              ;
+
+GET DIAGNOSTICS l_tuple = ROW_COUNT;
+RAISE NOTICE 'Insert into main_table_exe in loop % with first insert 
statement: % tuple inserted', l_count, l_tuple;
+
+RAISE NOTICE '--- Content of main_table_exe after loop % with first insert 
statement: begin ---', l_count;
+RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+FOR l_item IN SELECT * FROM main_table_exe LOOP
+    RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+END LOOP;
+RAISE NOTICE '--- Content of main_table_exe after loop % with first insert 
statement: end ---', l_count;
+
+execute 'INSERT INTO main_table_exe
+              ( id_auto
+              , id_natural
+              , value
+              , record_type
+              , id_file
+              )
+         SELECT '||l_count||'
+              , ma.id_natural
+              , value
+              , CASE WHEN mt.id_natural IS NULL THEN ''I'' ELSE ''U'' END AS 
record_type
+              , id_file
+           FROM main_table_exe ma
+           LEFT JOIN map_table_exe mt on mt.id_natural=ma.id_natural
+          WHERE ma.record_type=''N'' AND ma.id_file='||l_rec.id_file
+              ;
+
+        execute 'truncate table map_table_exe';
+
+GET DIAGNOSTICS l_tuple = ROW_COUNT;
+RAISE NOTICE 'Insert into main_table_exe in loop % with second insert 
statement: % tuple inserted', l_count, l_tuple;
+
+RAISE NOTICE '--- Content of main_table_exe after loop % with second insert 
statement: begin ---', l_count;
+RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+FOR l_item IN SELECT * FROM main_table_exe LOOP
+    RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+END LOOP;
+RAISE NOTICE '--- Content of main_table_exe after loop % with second insert 
statement: end ---', l_count;
+
+execute 'INSERT INTO map_table_exe
+              ( id_auto
+              , id_natural
+              )
+         SELECT ma.id_auto
+              , ma.id_natural
+           FROM main_table_exe ma
+          WHERE record_type NOT IN (''N'',''P'') AND id_file='||l_rec.id_file
+              ;
+
+     END LOOP;
+
+RAISE NOTICE '--- Final content of main_table_exe: begin ---';
+RAISE NOTICE 'id_auto, id_natural, value, record_type, id_file';
+FOR l_item IN SELECT * FROM main_table_exe LOOP
+    RAISE NOTICE '%, %, %, %, %', quote_ident(l_item.id_auto), 
quote_ident(l_item.id_natural), quote_ident(l_item.value), 
quote_ident(l_item.record_type), quote_ident(l_item.id_file);
+END LOOP;
+RAISE NOTICE '--- Final content of main_table_exe: end ---';
+
+  RETURN 'done';
+
+END;
+$body$
+;
+
+select f_load_exe();
+
+select * from main_table_exe;
+
+drop function if exists f_load_exe();
+drop table if exists src_table_exe;
+drop table if exists main_table_exe;
+drop table if exists map_table_exe;

Reply via email to