HAWQ-934. Populate canSetTag of PlannedStmt from Query object

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

Branch: refs/heads/master
Commit: eae0585f6109534c7ead553604c44b1dd483d8a3
Parents: 4e08f10
Author: Haisheng Yuan and Lubomir Petrov <[email protected]>
Authored: Mon Jul 18 14:51:39 2016 -0700
Committer: Ming LI <[email protected]>
Committed: Mon Aug 1 10:29:49 2016 +0800

----------------------------------------------------------------------
 .../gpopt/translate/CTranslatorDXLToPlStmt.cpp  |  5 +-
 src/backend/gpopt/utils/COptTasks.cpp           |  9 ++--
 .../gpopt/translate/CTranslatorDXLToPlStmt.h    |  2 +-
 src/include/gpopt/utils/COptTasks.h             |  2 +-
 src/test/regress/expected/gp_optimizer.out      | 52 ++++++++++++++++++++
 src/test/regress/sql/gp_optimizer.sql           | 40 +++++++++++++++
 6 files changed, 102 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/eae0585f/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
----------------------------------------------------------------------
diff --git a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp 
b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
index fe68cbd..e1daa1c 100644
--- a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
+++ b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
@@ -227,7 +227,8 @@ CTranslatorDXLToPlStmt::InitTranslators()
 PlannedStmt *
 CTranslatorDXLToPlStmt::PplstmtFromDXL
        (
-       const CDXLNode *pdxln
+       const CDXLNode *pdxln,
+       const Query *pquery
        )
 {
        GPOS_ASSERT(NULL != pdxln);
@@ -264,7 +265,7 @@ CTranslatorDXLToPlStmt::PplstmtFromDXL
 
        // store partitioned table indexes in planned stmt
        pplstmt->queryPartOids = m_pctxdxltoplstmt->PlPartitionedTables();
-       pplstmt->canSetTag = true;
+       pplstmt->canSetTag = pquery->canSetTag;
        pplstmt->relationOids = plOids;
        pplstmt->numSelectorsPerScanId = 
m_pctxdxltoplstmt->PlNumPartitionSelectors();
 

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/eae0585f/src/backend/gpopt/utils/COptTasks.cpp
----------------------------------------------------------------------
diff --git a/src/backend/gpopt/utils/COptTasks.cpp 
b/src/backend/gpopt/utils/COptTasks.cpp
index faa2bdb..8511f3e 100644
--- a/src/backend/gpopt/utils/COptTasks.cpp
+++ b/src/backend/gpopt/utils/COptTasks.cpp
@@ -661,7 +661,8 @@ COptTasks::Pplstmt
        (
        IMemoryPool *pmp,
        CMDAccessor *pmda,
-       const CDXLNode *pdxln
+       const CDXLNode *pdxln,
+       const Query *pquery
        )
 {
 
@@ -687,7 +688,7 @@ COptTasks::Pplstmt
        
        // translate DXL -> PlannedStmt
        CTranslatorDXLToPlStmt trdxltoplstmt(pmp, pmda, &ctxdxltoplstmt, 
gpdb::UlSegmentCountGP());
-       return trdxltoplstmt.PplstmtFromDXL(pdxln);
+       return trdxltoplstmt.PplstmtFromDXL(pdxln, pquery);
 }
 
 
@@ -1040,7 +1041,7 @@ COptTasks::PvOptimizeTask
                        // translate DXL->PlStmt only when needed
                        if (poctx->m_fGeneratePlStmt)
                        {
-                               poctx->m_pplstmt = (PlannedStmt *) 
gpdb::PvCopyObject(Pplstmt(pmp, &mda, pdxlnPlan));
+                               poctx->m_pplstmt = (PlannedStmt *) 
gpdb::PvCopyObject(Pplstmt(pmp, &mda, pdxlnPlan, ptrquerytodxl->Pquery()));
                        }
 
                        CStatisticsConfig *pstatsconf = pocconf->Pstatsconf();
@@ -1289,7 +1290,7 @@ COptTasks::PvPlstmtFromDXLTask
 
                // translate DXL -> PlannedStmt
                CTranslatorDXLToPlStmt trdxltoplstmt(pmp, amda.Pmda(), 
&ctxdxlplstmt, gpdb::UlSegmentCountGP());
-               PlannedStmt *pplstmt = 
trdxltoplstmt.PplstmtFromDXL(pdxlnOriginal);
+               PlannedStmt *pplstmt = 
trdxltoplstmt.PplstmtFromDXL(pdxlnOriginal, poctx->m_pquery);
                if (optimizer_print_plan)
                {
                        elog(NOTICE, "Plstmt: %s", 
gpdb::SzNodeToString(pplstmt));

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/eae0585f/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h
----------------------------------------------------------------------
diff --git a/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h 
b/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h
index acc84bf..dda7c9d 100644
--- a/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h
+++ b/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h
@@ -275,7 +275,7 @@ namespace gpdxl
                                );
 
                        // main translation routine for DXL tree -> PlannedStmt
-                       PlannedStmt *PplstmtFromDXL(const CDXLNode *pdxln);
+                       PlannedStmt *PplstmtFromDXL(const CDXLNode *pdxln, 
const Query *pquery);
 
                        // translate the join types from its DXL representation 
to the GPDB one
                        static JoinType JtFromEdxljt(EdxlJoinType edxljt);

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/eae0585f/src/include/gpopt/utils/COptTasks.h
----------------------------------------------------------------------
diff --git a/src/include/gpopt/utils/COptTasks.h 
b/src/include/gpopt/utils/COptTasks.h
index 8916814..abd478b 100644
--- a/src/include/gpopt/utils/COptTasks.h
+++ b/src/include/gpopt/utils/COptTasks.h
@@ -221,7 +221,7 @@ class COptTasks
 
                // translate a DXL tree into a planned statement
                static
-               PlannedStmt *Pplstmt(IMemoryPool *pmp, CMDAccessor *pmda, const 
CDXLNode *pdxln);
+               PlannedStmt *Pplstmt(IMemoryPool *pmp, CMDAccessor *pmda, const 
CDXLNode *pdxln, const Query *pquery);
 
                // load search strategy from given path
                static

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/eae0585f/src/test/regress/expected/gp_optimizer.out
----------------------------------------------------------------------
diff --git a/src/test/regress/expected/gp_optimizer.out 
b/src/test/regress/expected/gp_optimizer.out
index 23b1e5a..fd3a686 100644
--- a/src/test/regress/expected/gp_optimizer.out
+++ b/src/test/regress/expected/gp_optimizer.out
@@ -8678,6 +8678,58 @@ SELECT  cc, sum(nn) over() FROM v1_mpp_20470;
 
 drop view v1_mpp_20470;
 drop table t_mpp_20470;
+
+-- Checking if ORCA correctly populates canSetTag in PlannedStmt for multiple 
statements because of rules
+drop table if exists can_set_tag_target;
+NOTICE:  table "can_set_tag_target" does not exist, skipping
+create table can_set_tag_target
+(
+       x int,
+       y int,
+       z char
+);
+NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'x' 
as the Greenplum Database data distribution key for this table.
+HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make 
sure column(s) chosen are the optimal data distribution key to minimize skew.
+drop table if exists can_set_tag_audit;
+NOTICE:  table "can_set_tag_audit" does not exist, skipping
+create table can_set_tag_audit
+(
+       t timestamp without time zone,
+       x int,
+       y int,
+       z char
+);
+NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 't' 
as the Greenplum Database data distribution key for this table.
+HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make 
sure column(s) chosen are the optimal data distribution key to minimize skew.
+create rule can_set_tag_audit_update AS
+    ON UPDATE TO can_set_tag_target DO  INSERT INTO can_set_tag_audit (t, x, 
y, z)
+  VALUES (now(), old.x, old.y, old.z);
+insert into can_set_tag_target select i, i + 1, i + 2 from 
generate_series(1,2) as i;
+create role unpriv;
+NOTICE:  resource queue required -- using default resource queue "pg_default"
+grant all on can_set_tag_target to unpriv;
+grant all on can_set_tag_audit to unpriv;
+set role unpriv;
+show optimizer;
+ optimizer 
+-----------
+ on
+(1 row)
+
+update can_set_tag_target set y = y + 1;
+select count(1) from can_set_tag_audit;
+ count 
+-------
+     2
+(1 row)
+
+reset role;
+revoke all on can_set_tag_target from unpriv;
+revoke all on can_set_tag_audit from unpriv;
+drop role unpriv;
+drop table can_set_tag_target;
+drop table can_set_tag_audit;
+
 -- clean up
 drop schema orca cascade;
 NOTICE:  drop cascades to table orca.bm_dyn_test_onepart_1_prt_part5

http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/eae0585f/src/test/regress/sql/gp_optimizer.sql
----------------------------------------------------------------------
diff --git a/src/test/regress/sql/gp_optimizer.sql 
b/src/test/regress/sql/gp_optimizer.sql
index 9d02ae5..c1ab7a1 100644
--- a/src/test/regress/sql/gp_optimizer.sql
+++ b/src/test/regress/sql/gp_optimizer.sql
@@ -776,5 +776,45 @@ SELECT  cc, sum(nn) over() FROM v1_mpp_20470;
 
 drop view v1_mpp_20470;
 drop table t_mpp_20470;
+
+-- Checking if ORCA correctly populates canSetTag in PlannedStmt for multiple 
statements because of rules
+drop table if exists can_set_tag_target;
+create table can_set_tag_target
+(
+       x int,
+       y int,
+       z char
+);
+
+drop table if exists can_set_tag_audit;
+create table can_set_tag_audit
+(
+       t timestamp without time zone,
+       x int,
+       y int,
+       z char
+);
+
+create rule can_set_tag_audit_update AS
+    ON UPDATE TO can_set_tag_target DO  INSERT INTO can_set_tag_audit (t, x, 
y, z)
+  VALUES (now(), old.x, old.y, old.z);
+
+insert into can_set_tag_target select i, i + 1, i + 2 from 
generate_series(1,2) as i;
+
+create role unpriv;
+grant all on can_set_tag_target to unpriv;
+grant all on can_set_tag_audit to unpriv;
+set role unpriv;
+show optimizer;
+update can_set_tag_target set y = y + 1;
+select count(1) from can_set_tag_audit;
+reset role;
+
+revoke all on can_set_tag_target from unpriv;
+revoke all on can_set_tag_audit from unpriv;
+drop role unpriv;
+drop table can_set_tag_target;
+drop table can_set_tag_audit;
+
 -- clean up
 drop schema orca cascade;

Reply via email to