You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/05/17 23:44:37 UTC

[incubator-doris] branch master updated: [BUG] fix information_schema.columns results not correctly on vec engine (#9612)

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

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new bfb1ab059d [BUG] fix information_schema.columns results not correctly on vec engine (#9612)
bfb1ab059d is described below

commit bfb1ab059d73fed59e391f1a82a40eb80a82d6b5
Author: camby <10...@qq.com>
AuthorDate: Wed May 18 07:44:32 2022 +0800

    [BUG] fix information_schema.columns results not correctly on vec engine (#9612)
    
    * VSchemaScanNode get_next bugfix
    
    * add regression-test case for VSchemaScanNode
    
    Co-authored-by: cambyzju <zh...@baidu.com>
---
 be/src/vec/exec/vmysql_scan_node.cpp               |  1 +
 be/src/vec/exec/vodbc_scan_node.cpp                |  1 +
 be/src/vec/exec/vschema_scan_node.cpp              |  7 +-
 .../data/account/test_information_schema.out       | 31 +++++++
 .../suites/account/test_information_schema.groovy  | 95 ++++++++++++++++++++++
 5 files changed, 132 insertions(+), 3 deletions(-)

diff --git a/be/src/vec/exec/vmysql_scan_node.cpp b/be/src/vec/exec/vmysql_scan_node.cpp
index 980fb57eb8..d5cec3e215 100644
--- a/be/src/vec/exec/vmysql_scan_node.cpp
+++ b/be/src/vec/exec/vmysql_scan_node.cpp
@@ -46,6 +46,7 @@ Status VMysqlScanNode::get_next(RuntimeState* state, vectorized::Block* block, b
     bool mysql_eos = false;
 
     do {
+        columns.resize(_slot_num);
         for (int i = 0; i < _slot_num; ++i) {
             if (mem_reuse) {
                 columns[i] = std::move(*block->get_by_position(i).column).mutate();
diff --git a/be/src/vec/exec/vodbc_scan_node.cpp b/be/src/vec/exec/vodbc_scan_node.cpp
index 938c226fa6..8366ee0c14 100644
--- a/be/src/vec/exec/vodbc_scan_node.cpp
+++ b/be/src/vec/exec/vodbc_scan_node.cpp
@@ -58,6 +58,7 @@ Status VOdbcScanNode::get_next(RuntimeState* state, Block* block, bool* eos) {
     do {
         RETURN_IF_CANCELLED(state);
 
+        columns.resize(column_size);
         for (auto i = 0; i < column_size; i++) {
             if (mem_reuse) {
                 columns[i] = std::move(*block->get_by_position(i).column).mutate();
diff --git a/be/src/vec/exec/vschema_scan_node.cpp b/be/src/vec/exec/vschema_scan_node.cpp
index c1aed663a1..2c02834b9a 100644
--- a/be/src/vec/exec/vschema_scan_node.cpp
+++ b/be/src/vec/exec/vschema_scan_node.cpp
@@ -69,12 +69,14 @@ Status VSchemaScanNode::get_next(RuntimeState* state, vectorized::Block* block,
     if (!_is_init) return Status::InternalError("used before initialize.");
     RETURN_IF_ERROR(exec_debug_action(TExecNodePhase::GETNEXT));
     RETURN_IF_CANCELLED(state);
-    bool mem_reuse = block->mem_reuse();
-    DCHECK(block->rows() == 0);
     std::vector<vectorized::MutableColumnPtr> columns(_slot_num);
     bool schema_eos = false;
 
     do {
+        bool mem_reuse = block->mem_reuse();
+        DCHECK(block->rows() == 0);
+
+        columns.resize(_slot_num);
         for (int i = 0; i < _slot_num; ++i) {
             if (mem_reuse) {
                 columns[i] = std::move(*block->get_by_position(i).column).mutate();
@@ -88,7 +90,6 @@ Status VSchemaScanNode::get_next(RuntimeState* state, vectorized::Block* block,
             // get all slots from schema table.
             RETURN_IF_ERROR(_schema_scanner->get_next_row(_src_single_tuple, _tuple_pool.get(),
                                                           &schema_eos));
-
             if (schema_eos) {
                 *eos = true;
                 break;
diff --git a/regression-test/data/account/test_information_schema.out b/regression-test/data/account/test_information_schema.out
new file mode 100644
index 0000000000..1e6a3994f3
--- /dev/null
+++ b/regression-test/data/account/test_information_schema.out
@@ -0,0 +1,31 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !sql --
+612
+
+-- !sql --
+578
+
+-- !sql --
+544
+
+-- !sql --
+510
+
+-- !sql --
+476
+
+-- !sql --
+612
+
+-- !sql --
+578
+
+-- !sql --
+544
+
+-- !sql --
+510
+
+-- !sql --
+476
+
diff --git a/regression-test/suites/account/test_information_schema.groovy b/regression-test/suites/account/test_information_schema.groovy
new file mode 100644
index 0000000000..71c89c6f58
--- /dev/null
+++ b/regression-test/suites/account/test_information_schema.groovy
@@ -0,0 +1,95 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+suite("test_information_schema", "columns") {
+    def dbPrefix = "db_test_schema_"
+    def tablePrefix = "tb_test_schema_"
+
+    // create lots of dbs and tables to make rows in `information_schema.columns` more than 1024
+    for (int i = 1; i <= 5; i++) {
+        def dbName = dbPrefix + i.toString()
+        sql "CREATE DATABASE IF NOT EXISTS `${dbName}`"
+        sql "USE `${dbName}`"
+        for (int j = i; j <= 18; j++) {
+            def tableName = tablePrefix + j.toString();
+            sql """
+                CREATE TABLE IF NOT EXISTS `${tableName}` (
+                `aaa` varchar(170) NOT NULL COMMENT "",
+                `bbb` varchar(100) NOT NULL COMMENT "",
+                `ccc` varchar(170) NULL COMMENT "",
+                `ddd` varchar(120) NULL COMMENT "",
+                `eee` varchar(120) NULL COMMENT "",
+                `fff` varchar(130) NULL COMMENT "",
+                `ggg` varchar(170) NULL COMMENT "",
+                `hhh` varchar(170) NULL COMMENT "",
+                `jjj` varchar(170) NULL COMMENT "",
+                `kkk` varchar(170) NULL COMMENT "",
+                `lll` varchar(170) NULL COMMENT "",
+                `mmm` varchar(170) NULL COMMENT "",
+                `nnn` varchar(70) NULL COMMENT "",
+                `ooo` varchar(140) NULL COMMENT "",
+                `ppp` varchar(70) NULL COMMENT "",
+                `qqq` varchar(130) NULL COMMENT "",
+                `rrr` bigint(20) NULL COMMENT "",
+                `sss` bigint(20) NULL COMMENT "",
+                `ttt` decimal(24, 2) NULL COMMENT "",
+                `uuu` decimal(24, 2) NULL COMMENT "",
+                `vvv` decimal(24, 2) NULL COMMENT "",
+                `www` varchar(50) NULL COMMENT "",
+                `xxx` varchar(190) NULL COMMENT "",
+                `yyy` varchar(190) NULL COMMENT "",
+                `zzz` varchar(100) NULL COMMENT "",
+                `aa` bigint(20) NULL COMMENT "",
+                `bb` bigint(20) NULL COMMENT "",
+                `cc` bigint(20) NULL COMMENT "",
+                `dd` varchar(60) NULL COMMENT "",
+                `ee` varchar(60) NULL COMMENT "",
+                `ff` varchar(60) NULL COMMENT "",
+                `gg` varchar(50) NULL COMMENT "",
+                `hh` bigint(20) NULL COMMENT "",
+                `ii` bigint(20) NULL COMMENT ""
+                ) ENGINE=OLAP
+                DUPLICATE KEY(`aaa`)
+                COMMENT "OLAP"
+                DISTRIBUTED BY HASH(`aaa`) BUCKETS 1
+                PROPERTIES (
+                "replication_allocation" = "tag.location.default: 1",
+                "in_memory" = "false",
+                "storage_format" = "V2"
+                )
+            """
+        }
+    }
+
+    sql "set enable_vectorized_engine=true"
+    for (int i = 1; i <= 5; i++) {
+        def dbName = dbPrefix + i.toString()
+        sql "USE information_schema"
+        qt_sql "SELECT COUNT(*) FROM `columns` WHERE TABLE_SCHEMA='${dbName}'"
+    }
+
+    sql "set enable_vectorized_engine=false"
+    for (int i = 1; i <= 5; i++) {
+        def dbName = dbPrefix + i.toString()
+        sql "USE information_schema"
+        qt_sql "SELECT COUNT(*) FROM `columns` WHERE TABLE_SCHEMA='${dbName}'"
+    }
+
+    for (int i = 1; i <= 5; i++) {
+        def dbName = dbPrefix + i.toString()
+        sql "DROP DATABASE `${dbName}`"
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org