This is an automated email from the ASF dual-hosted git repository.

ztao1987 pushed a commit to branch ztao
in repository https://gitbox.apache.org/repos/asf/hawq.git


The following commit(s) were added to refs/heads/ztao by this push:
     new 4f67d22  HAWQ-1822. Enable heap table
4f67d22 is described below

commit 4f67d22e1cd242a4be2660d0eda20e8cbe1c926f
Author: ztao1987 <zhenglin.ta...@gmail.com>
AuthorDate: Wed Dec 15 11:22:12 2021 +0800

    HAWQ-1822. Enable heap table
---
 contrib/magma/magma.c              |  2 +-
 src/backend/commands/indexcmds.c   |  4 ++--
 src/backend/commands/tablecmds.c   | 16 +++++++++-------
 src/backend/parser/analyze.c       | 15 ++++++++++++++-
 src/backend/postmaster/identity.c  | 23 +++++++++++++++++++++++
 src/backend/tcop/utility.c         | 12 ++++++++----
 src/backend/utils/cache/relcache.c |  3 ++-
 src/backend/utils/misc/guc.c       | 21 +++++++++++++++++++++
 src/include/catalog/pg_class.h     |  2 +-
 src/include/postmaster/identity.h  |  1 +
 src/include/utils/guc.h            |  9 +++++++++
 11 files changed, 91 insertions(+), 17 deletions(-)

diff --git a/contrib/magma/magma.c b/contrib/magma/magma.c
index b7d6758..c732b85 100644
--- a/contrib/magma/magma.c
+++ b/contrib/magma/magma.c
@@ -409,7 +409,7 @@ Datum magma_protocol_blocklocation(PG_FUNCTION_ARGS) {
   MagmaTablePtr table = MagmaClientC_FetchTable(client, 
useClientCacheDirectly);
   magma_check_result(&client);
 
-  elog(LOG, "magma_protocol_blocklocation pass fetch table");
+  elog(DEBUG3, "magma_protocol_blocklocation pass fetch table");
 
   /*
    * Step 3. map ranges to block locations
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 345de0b..464a82e 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -755,8 +755,8 @@ DefineIndex(Oid relationId,
         }
         else
         {
-               /* magma and native orc support index */
-               if (!(RelationIsOrc(rel) || RelationIsMagmaTable2(relationId)))
+                /* Native orc, heap table and magma support index */
+                if (!RelationIsOrc(rel) && !RelationIsHeap(rel) && 
!RelationIsMagmaTable(relationId))
                {
                        ereport(ERROR, (errcode(ERRCODE_CDB_FEATURE_NOT_YET), 
errmsg("Cannot support DefineIndex")));
                }
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index a92eaa6..a21d803 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -499,8 +499,8 @@ DefineRelation(CreateStmt *stmt, char relkind, char 
relstorage,
     Oid reloid = 0;
     Assert(stmt->base.relation->schemaname == NULL || 
strlen(stmt->base.relation->schemaname)>0);
 
-    /* forbid create non-system table on tablespace pg_default */
-    if((!IsBootstrapProcessingMode()) && 
(isPgDefaultTablespace(stmt->base.tablespacename)))
+    /* forbid create non-system table on tablespace pg_default when 
enable_pg_default_for_non_system_table is not true */
+    if(!enable_pg_default_for_non_system_table && 
(!IsBootstrapProcessingMode()) && 
(isPgDefaultTablespace(stmt->base.tablespacename)))
     {
        ereport(ERROR,
                                        (errcode(ERRCODE_CDB_FEATURE_NOT_YET),
@@ -605,11 +605,13 @@ DefineRelation_int(CreateStmt *stmt,
                 * dispatch.
                 */
          if (pg_strcasecmp("pg_default", stmt->base.tablespacename) == 0)
-               ereport(ERROR,
-                   (errcode(ERRCODE_UNDEFINED_OBJECT),
-                    errmsg("can not create ao format table on tablespace 
\"%s\" ",
-                       stmt->base.tablespacename),
-                    errOmitLocation(true)));
+               if (!enable_pg_default_for_non_system_table) {  
+                        ereport(ERROR,
+                            (errcode(ERRCODE_UNDEFINED_OBJECT),
+                             errmsg("can not create ao format table on 
tablespace \"%s\" ",
+                                stmt->base.tablespacename),
+                             errOmitLocation(true)));
+                }
 
                tablespaceId = get_tablespace_oid(stmt->base.tablespacename);
                if (!OidIsValid(tablespaceId))
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index ce75706..15226b0 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -3138,7 +3138,20 @@ static void transformDistributedBy(ParseState *pstate, 
CreateStmtContext *cxt,
     *policyp = NULL;
     return;
   }
-
+  
+  /*
+   * Currently heap table only exists in hawq's master, so there is no
+   * policy information.
+   */
+  if (enable_heap_table_on_master) {
+    bool appendonly;
+    bool hasAppendOnly = GetRelOpt_appendonly_fromOptions(options, 
&appendonly);
+    if (hasAppendOnly && !appendonly) {
+      *policyp = NULL;
+      return;
+    }
+  }
+  
   policy = (GpPolicy *)palloc(sizeof(GpPolicy) +
                               maxattrs * sizeof(policy->attrs[0]));
   policy->ptype = POLICYTYPE_PARTITIONED;
diff --git a/src/backend/postmaster/identity.c 
b/src/backend/postmaster/identity.c
index 94d202f..2e5ed19 100644
--- a/src/backend/postmaster/identity.c
+++ b/src/backend/postmaster/identity.c
@@ -535,6 +535,29 @@ int GetRelOpt_bucket_num_fromOptions(List *options, int 
default_val)
                }
        return ((bucketnum>0)?bucketnum : (default_val));
 }
+
+/*
+ * If appendonly is set, return true, otherwise return false.
+ */
+bool GetRelOpt_appendonly_fromOptions(List *options, bool *appendonly)
+{
+  ListCell   *cell;
+  /* Scan list to see if "appendonly" was included */
+  if(options)
+    foreach(cell, options)
+    {
+      DefElem    *def = (DefElem *) lfirst(cell);
+
+      if (pg_strcasecmp(def->defname, "appendonly") == 0)
+      {
+        bool need_free_arg = false;
+        *appendonly = defGetString(def, &need_free_arg) == "true";
+        return true;
+      }
+    }
+  return false;
+}
+
 /** 
   *    Read Relation Option from catalog Relation
   */
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 89d20e0..1cd6e2b 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -417,20 +417,24 @@ QueryIsReadOnly(Query *parsetree)
 
 /*
  * CanCreateIndex: can support create index
- * So far, magma table and native orc could support index
+ * So far, magma table, native orc and heap table could support index
  */
 void CanSupportIndex(IndexStmt *stmt, Oid relid)
 {
        /* 1. upgrade mode should support index operation */
        if (gp_upgrade_mode) return;
-
+       
        bool supportIndex = false;
        Relation rel = heap_open(relid, AccessShareLock);
        bool nativeOrc = RelationIsOrc(rel);
+       bool isHeap = RelationIsHeap(rel);
        heap_close(rel, AccessShareLock);
+       
+       /* 2. heap table supports index */
+       if (isHeap) return;
 
        /*
-        * 2. deal magma table and native orc
+        * 3. deal magma table and native orc
         * for "stmt->magma", deal with special partition situation, oushu 
issue #1049
         * its ugly, but there is no elegant way now
         */
@@ -446,7 +450,7 @@ void CanSupportIndex(IndexStmt *stmt, Oid relid)
        if (supportIndex)
        {
                /*
-                * 3. magma/native orc index cant support the accessory 
conditions
+                * 4. magma/native orc index cant support the accessory 
conditions
                 */
                if (stmt->options) {
                        ereport(ERROR,
diff --git a/src/backend/utils/cache/relcache.c 
b/src/backend/utils/cache/relcache.c
index 521d2b6..a9f62ac 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -1301,9 +1301,10 @@ RelationBuildDesc(Oid targetRelId, bool insertIt)
 
     /*
      * initialize Greenplum Database partitioning info
+     * currently heap table only exists in hawq's master, so there is no 
rd_cdbpolicy.
      */
     if (relation->rd_rel->relkind == RELKIND_RELATION &&
-        !IsSystemRelation(relation))
+        !IsSystemRelation(relation) && !RelationIsHeap(relation))
         relation->rd_cdbpolicy = GpPolicyFetch(CacheMemoryContext, 
targetRelId);
 
     relation->rd_cdbDefaultStatsWarningIssued = false;
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 20f8f1c..25f8714 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -773,6 +773,8 @@ int hawq_rm_nvseg_for_analyze_nopart_perquery_perseg_limit;
 int hawq_rm_nvseg_for_analyze_part_perquery_perseg_limit;
 int hawq_rm_nvseg_for_analyze_nopart_perquery_limit;
 int hawq_rm_nvseg_for_analyze_part_perquery_limit;
+bool enable_heap_table_on_master;
+bool enable_pg_default_for_non_system_table;
 double   optimizer_cost_threshold;
 double  optimizer_nestloop_factor;
 double  locality_upper_bound;
@@ -4581,6 +4583,25 @@ static struct config_bool ConfigureNamesBool[] =
     &hawq_init_with_hdfs,
     true, NULL, NULL
   },
+  
+        {
+                {"enable_heap_table_on_master", PGC_USERSET, DEVELOPER_OPTIONS,
+                        gettext_noop("Enable heap tables on the master."),
+                        NULL,
+                        GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE
+                },
+                &enable_heap_table_on_master,
+                false, NULL, NULL
+        },
+        {
+               {"enable_pg_default_for_non_system_table", PGC_USERSET, 
DEVELOPER_OPTIONS,
+                        gettext_noop("Enable pg_default for non-system 
tables."),
+                        NULL,
+                        GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE
+                },
+                &enable_pg_default_for_non_system_table,
+                false, NULL, NULL
+        },
 
        /* End-of-list marker */
        {
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index 59614df..da4ac2f 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -246,7 +246,7 @@ DESCR("");
 #define                  RELSTORAGE_EXTERNAL 'x'
 #define                  RELSTORAGE_FOREIGN 'f'
 
-static inline bool relstorage_is_buffer_pool(char c)
+static inline bool relstorage_is_heap(char c)
 {
        return (c == RELSTORAGE_HEAP);
 }
diff --git a/src/include/postmaster/identity.h 
b/src/include/postmaster/identity.h
index 7aed5e1..d98e8f0 100644
--- a/src/include/postmaster/identity.h
+++ b/src/include/postmaster/identity.h
@@ -94,6 +94,7 @@ extern int GetUserDefinedFunctionVsegNum(void);
 extern int GetAnalyzeVSegNum(void);
 extern int      GetCopyFromVSegNum(void);
 extern int GetRelOpt_bucket_num_fromOptions(List *options, int default_val);
+extern bool GetRelOpt_appendonly_fromOptions(List *options, bool *appendonly);
 extern int GetRelOpt_bucket_num_fromRel(Relation relation, int default_val);
 extern int GetRelOpt_bucket_num_fromRangeVar(const RangeVar* rel_rv, int 
default_val);
 extern int GetDefaultPartitionNum(void);
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index 369b704..a788deb 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -322,6 +322,15 @@ extern int 
hawq_rm_nvseg_for_analyze_nopart_perquery_perseg_limit;
 extern int hawq_rm_nvseg_for_analyze_part_perquery_perseg_limit;
 extern int hawq_rm_nvseg_for_analyze_nopart_perquery_limit;
 extern int hawq_rm_nvseg_for_analyze_part_perquery_limit;
+
+/////////////////////////////////////////////////////////////////////////
+/*
+ * These guc and related code are temporary, maybe will be delete afterwords.
+ */
+extern bool enable_heap_table_on_master;
+extern bool enable_pg_default_for_non_system_table;
+/////////////////////////////////////////////////////////////////////////
+
 extern bool allow_file_count_bucket_num_mismatch;
 extern bool enable_pg_stat_activity_history;
 

Reply via email to