You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by db...@apache.org on 2019/08/14 16:20:15 UTC

[trafodion] branch master updated: [TRAFODION-3324] Prevent core when histogram exists on non-existent column

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

dbirdsall pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafodion.git


The following commit(s) were added to refs/heads/master by this push:
     new 3632dae  [TRAFODION-3324] Prevent core when histogram exists on non-existent column
     new 1585ac4  Merge pull request #1853 from DaveBirdsall/Trafodion3324
3632dae is described below

commit 3632daed7831ffc405b24c59e9038cc4a635c518
Author: Dave Birdsall <db...@apache.org>
AuthorDate: Mon Aug 12 18:39:59 2019 +0000

    [TRAFODION-3324] Prevent core when histogram exists on non-existent column
---
 core/sql/bin/SqlciErrors.txt                           |  2 +-
 core/sql/ustat/hs_const.h                              |  1 +
 core/sql/ustat/hs_read.cpp                             | 18 ++++++++++++++++++
 .../src/asciidoc/_chapters/update_stats_msgs.adoc      | 18 ++++++++++++++++++
 4 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/core/sql/bin/SqlciErrors.txt b/core/sql/bin/SqlciErrors.txt
index 8034bf1..e66074a 100644
--- a/core/sql/bin/SqlciErrors.txt
+++ b/core/sql/bin/SqlciErrors.txt
@@ -1924,7 +1924,7 @@ drop the default context
 9232 ZZZZZ 99999 BEGINNER MAJOR DBADMIN Incremental UPDATE STATISTICS: cannot proceed because of the on-going IUS transaction originated at $0~String0. 
 9233 ZZZZZ 99999 BEGINNER MAJOR DBADMIN No operation was done since the table consists only of LOB columns. 
 9234 ZZZZZ 99999 BEGINNER MINOR LOGONLY Incremental UPDATE STATISTICS: a new high frequency value is detected for column $0~string0. A regular UPDATE STATISTICS is performed instead.
-9235 ZZZZZ 99999 BEGINNER MINOR LOGONLY --- unused ---
+9235 ZZZZZ 99999 BEGINNER MINOR LOGONLY Histogram for non-existent column found on table $0~string0. Consider dropping and recreating histograms for this table.
 9236 ZZZZZ 99999 BEGINNER MINOR LOGONLY Incremental UPDATE STATISTICS: the histogram for column $0~string0 is empty. A regular UPDATE STATISTICS is performed instead.
 9237 ZZZZZ 99999 BEGINNER MINOR LOGONLY Incremental UPDATE STATISTICS: WHERE clause of an IUS statement cannot contain $0~String0.
 9238 ZZZZZ 99999 BEGINNER INFRM DBADMIN Histograms were updated successfully, but partition statistics could not be updated from file labels.
diff --git a/core/sql/ustat/hs_const.h b/core/sql/ustat/hs_const.h
index 876ac3e..1a8b4ab 100644
--- a/core/sql/ustat/hs_const.h
+++ b/core/sql/ustat/hs_const.h
@@ -160,6 +160,7 @@ enum USTAT_ERROR_CODES {UERR_SYNTAX_ERROR                    = 15001,
                         UERR_IUS_IN_PROGRESS                 = 9232,
                         UERR_ALL_LOB_COLUMNS                 = 9233,
                         UERR_IUS_INSERT_NONMFV_OVERFLOW      = 9234,
+                        UERR_WARNING_NONEXISTENT_COLUMN      = 9235,
                         UERR_IUS_NO_EXISTING_STATS           = 9236,
                         UERR_IUS_WHERE_CLAUSE                = 9237,
                         UERR_WARNING_FILESTATS_FAILED        = 9238,
diff --git a/core/sql/ustat/hs_read.cpp b/core/sql/ustat/hs_read.cpp
index 80def3d..70642fc 100644
--- a/core/sql/ustat/hs_read.cpp
+++ b/core/sql/ustat/hs_read.cpp
@@ -1469,6 +1469,7 @@ Lng32 HSHistogrmCursor::fetch( HSColStats &cs
   NABoolean updateReadTime = FALSE, continueAfterReadTimeCheck = FALSE;
   HSLogMan *LM = HSLogMan::Instance();
   HSTranMan *TM = HSTranMan::Instance();  // Do not reset, this is not an entry point.
+  NABoolean nonExistentColumnWarningIssued = FALSE;
 
   // These are local variables, not in HSColStats class, as their state is
   // really local to this loop.  They are distinct from the booleans in
@@ -1534,6 +1535,23 @@ Lng32 HSHistogrmCursor::fetch( HSColStats &cs
       tableColNum_ += offset; // Align columns. See comment above.
       colmap[i] = tableColNum_;
 
+      if (tableColNum_ >= cs.colArray().entries())
+        {
+          // We have encountered a histogram for a column that does not exist.
+          // This can happen if a Hive table has histograms, and then is dropped
+          // and recreated with fewer columns outside of Trafodion. It could
+          // also happen if someone foolishly, maliciously or otherwise 
+          // manually modifies the SB_HISTOGRAMS.COLUMN_NUMBER column. Ignore
+          // this histogram, but also raise a warning.
+          ComDiagsArea *ptrDiags = CmpCommon::diags();
+          if (ptrDiags && !nonExistentColumnWarningIssued)
+            {
+              nonExistentColumnWarningIssued = TRUE;  // just issue the warning once
+              *ptrDiags << DgSqlCode(UERR_WARNING_NONEXISTENT_COLUMN)
+                 << DgString0(tabDef->getObjectFullName().data());
+            }
+          continue;
+        }
       const NAColumn *nacol = cs.colArray()[tableColNum_];
       if (preFetch || nacol->needHistogram())
         needHistogram = TRUE;
diff --git a/docs/messages_guide/src/asciidoc/_chapters/update_stats_msgs.adoc b/docs/messages_guide/src/asciidoc/_chapters/update_stats_msgs.adoc
index 71b74c7..ebcff35 100644
--- a/docs/messages_guide/src/asciidoc/_chapters/update_stats_msgs.adoc
+++ b/docs/messages_guide/src/asciidoc/_chapters/update_stats_msgs.adoc
@@ -419,6 +419,24 @@ in the sample table.
 is necessary.
 
 <<<
+[[SQL-9235]]
+== SQL 9235
+
+```
+Histogram for non-existent column found on table <table-name>. Consider dropping and recreating histograms for this table.
+```
+
+*Cause:* A SQL statement was compiled that referenced the given table name. When the compiler
+read the histograms for that table, it encountered one for a non-existent column. This can happen,
+for example, if a Hive table is recreated with fewer columns outside of Trafodion. In this case,
+Trafodion does not know in advance that the histograms are now stale.
+
+*Effect:* This is a warning only. {project-name} attempts to continue compiling the query.
+
+*Recovery:* To remove this warning, perform UPDATE STATISTICS ... CLEAR on the given table. This
+will remove all histograms on the table. If histograms are desired, then perform UPDATE STATISTICS
+to create the desired histograms.
+
 [[SQL-9240]]
 == SQL 9240