diff --git a/be/src/exec/olap_rewrite_node.cpp b/be/src/exec/olap_rewrite_node.cpp index 2027c981dbce7a..2e4b6e142b446c 100644 --- a/be/src/exec/olap_rewrite_node.cpp +++ b/be/src/exec/olap_rewrite_node.cpp @@ -245,6 +245,7 @@ Status OlapRewriteNode::close(RuntimeState* state) { if (is_closed()) { return Status::OK; } + _child_row_batch.reset(); // RETURN_IF_ERROR(child(0)->close(state)); Expr::close(_columns, state); return ExecNode::close(state); diff --git a/be/src/exec/schema_scan_node.cpp b/be/src/exec/schema_scan_node.cpp index 191faeb0efba21..aebddf24043c26 100644 --- a/be/src/exec/schema_scan_node.cpp +++ b/be/src/exec/schema_scan_node.cpp @@ -211,6 +211,9 @@ void SchemaScanNode::copy_one_row() { memset(_dest_tuple, 0, _dest_tuple_desc->num_null_bytes()); for (int i = 0; i < _slot_num; ++i) { + if (!_dest_tuple_desc->slots()[i]->is_materialized()) { + continue; + } int j = _index_map[i]; if (_src_tuple->is_null(_src_tuple_desc->slots()[j]->null_indicator_offset())) { diff --git a/be/src/exec/schema_scanner/frontend_helper.cpp b/be/src/exec/schema_scanner/frontend_helper.cpp index 381b5a4b4fda00..08ccf88c348c67 100644 --- a/be/src/exec/schema_scanner/frontend_helper.cpp +++ b/be/src/exec/schema_scanner/frontend_helper.cpp @@ -215,6 +215,14 @@ Status FrontendHelper::show_varialbes( return Status::OK; } +std::string FrontendHelper::extract_db_name(const std::string& full_name) { + auto found = full_name.find(':'); + if (found == std::string::npos) { + return full_name; + } + found++; + return std::string(full_name.c_str() + found, full_name.size() - found); +} + } -/* vim: set ts=4 sw=4 sts=4 tw=100 */ diff --git a/be/src/exec/schema_scanner/frontend_helper.h b/be/src/exec/schema_scanner/frontend_helper.h index 3d4ca48b20c77d..b0ed1d97150e0e 100644 --- a/be/src/exec/schema_scanner/frontend_helper.h +++ b/be/src/exec/schema_scanner/frontend_helper.h @@ -56,6 +56,8 @@ class FrontendHelper { const int32_t port, const TShowVariableRequest &var_params, TShowVariableResult *var_result); + + static std::string extract_db_name(const std::string& full_name); private: static ExecEnv* _s_exec_env; }; @@ -64,4 +66,3 @@ class FrontendHelper { #endif -/* vim: set ts=4 sw=4 sts=4 tw=100 : */ diff --git a/be/src/exec/schema_scanner/schema_columns_scanner.cpp b/be/src/exec/schema_scanner/schema_columns_scanner.cpp index eabbcd8e91b614..32d28d13afdef1 100644 --- a/be/src/exec/schema_scanner/schema_columns_scanner.cpp +++ b/be/src/exec/schema_scanner/schema_columns_scanner.cpp @@ -146,9 +146,10 @@ Status SchemaColumnsScanner::fill_one_row(Tuple *tuple, MemPool *pool) { { void *slot = tuple->get_slot(_tuple_desc->slots()[1]->tuple_offset()); StringValue* str_slot = reinterpret_cast(slot); - str_slot->ptr = (char *)pool->allocate(_db_result.dbs[_db_index - 1].length()); - str_slot->len = _db_result.dbs[_db_index - 1].length(); - memcpy(str_slot->ptr, _db_result.dbs[_db_index - 1].c_str(), str_slot->len); + std::string db_name = FrontendHelper::extract_db_name(_db_result.dbs[_db_index - 1]); + str_slot->ptr = (char *)pool->allocate(db_name.size()); + str_slot->len = db_name.size(); + memcpy(str_slot->ptr, db_name.c_str(), str_slot->len); } // table { diff --git a/be/src/exec/schema_scanner/schema_schemata_scanner.cpp b/be/src/exec/schema_scanner/schema_schemata_scanner.cpp index 23486cee20587b..eb38b7103ae35f 100644 --- a/be/src/exec/schema_scanner/schema_schemata_scanner.cpp +++ b/be/src/exec/schema_scanner/schema_schemata_scanner.cpp @@ -75,12 +75,10 @@ Status SchemaSchemataScanner::fill_one_row(Tuple *tuple, MemPool *pool) { { void *slot = tuple->get_slot(_tuple_desc->slots()[1]->tuple_offset()); StringValue* str_slot = reinterpret_cast(slot); - str_slot->ptr = (char *)pool->allocate(_db_result.dbs[_db_index].length()); - if (NULL == str_slot->ptr) { - return Status("Allocate memory failed."); - } - str_slot->len = _db_result.dbs[_db_index].length(); - memcpy(str_slot->ptr, _db_result.dbs[_db_index].c_str(), str_slot->len); + std::string db_name = FrontendHelper::extract_db_name(_db_result.dbs[_db_index]); + str_slot->ptr = (char *)pool->allocate(db_name.size()); + str_slot->len = db_name.size(); + memcpy(str_slot->ptr, db_name.c_str(), str_slot->len); } // DEFAULT_CHARACTER_SET_NAME { diff --git a/be/src/exec/schema_scanner/schema_tables_scanner.cpp b/be/src/exec/schema_scanner/schema_tables_scanner.cpp index 06401265ff1630..f4581a5a881d03 100644 --- a/be/src/exec/schema_scanner/schema_tables_scanner.cpp +++ b/be/src/exec/schema_scanner/schema_tables_scanner.cpp @@ -95,12 +95,10 @@ Status SchemaTablesScanner::fill_one_row(Tuple *tuple, MemPool *pool) { { void *slot = tuple->get_slot(_tuple_desc->slots()[1]->tuple_offset()); StringValue* str_slot = reinterpret_cast(slot); - str_slot->ptr = (char *)pool->allocate(_db_result.dbs[_db_index - 1].length()); - if (NULL == str_slot->ptr) { - return Status("Allocate memcpy failed."); - } - str_slot->len = _db_result.dbs[_db_index - 1].length(); - memcpy(str_slot->ptr, _db_result.dbs[_db_index - 1].c_str(), str_slot->len); + std::string db_name = FrontendHelper::extract_db_name(_db_result.dbs[_db_index - 1]); + str_slot->ptr = (char *)pool->allocate(db_name.size()); + str_slot->len = db_name.size(); + memcpy(str_slot->ptr, db_name.c_str(), str_slot->len); } // name { diff --git a/be/src/exec/schema_scanner/schema_tables_scanner.h b/be/src/exec/schema_scanner/schema_tables_scanner.h index 2ff7a776352d5d..305ee3bc5afaa3 100644 --- a/be/src/exec/schema_scanner/schema_tables_scanner.h +++ b/be/src/exec/schema_scanner/schema_tables_scanner.h @@ -40,7 +40,7 @@ class SchemaTablesScanner : public SchemaScanner { int _db_index; int _table_index; - TGetDbsResult _db_result; + TGetDbsResult _db_result; TListTableStatusResult _table_result; static SchemaScanner::ColumnDesc _s_tbls_columns[]; }; diff --git a/be/src/exec/schema_scanner/schema_variables_scanner.h b/be/src/exec/schema_scanner/schema_variables_scanner.h index 50b9659f79ffa6..3243be78d6b2a9 100644 --- a/be/src/exec/schema_scanner/schema_variables_scanner.h +++ b/be/src/exec/schema_scanner/schema_variables_scanner.h @@ -53,5 +53,4 @@ class SchemaVariablesScanner : public SchemaScanner { }; } - #endif diff --git a/fe/src/com/baidu/palo/analysis/BaseTableRef.java b/fe/src/com/baidu/palo/analysis/BaseTableRef.java index 631701edab8b69..50a0c0d3c514df 100644 --- a/fe/src/com/baidu/palo/analysis/BaseTableRef.java +++ b/fe/src/com/baidu/palo/analysis/BaseTableRef.java @@ -41,7 +41,7 @@ public BaseTableRef(TableRef ref, Table table, TableName tableName) { this.name = tableName; // Set implicit aliases if no explicit one was given. if (hasExplicitAlias()) return; - aliases_ = new String[] { name.toString(), table.getName() }; + aliases_ = new String[] { name.toString(), tableName.getNoClusterString(), table.getName() }; } protected BaseTableRef(BaseTableRef other) { diff --git a/fe/src/com/baidu/palo/analysis/ExprSubstitutionMap.java b/fe/src/com/baidu/palo/analysis/ExprSubstitutionMap.java index c0ec82cecbe470..1a5c6c131a9359 100644 --- a/fe/src/com/baidu/palo/analysis/ExprSubstitutionMap.java +++ b/fe/src/com/baidu/palo/analysis/ExprSubstitutionMap.java @@ -40,6 +40,7 @@ public final class ExprSubstitutionMap { private final static Logger LOG = LoggerFactory.getLogger(ExprSubstitutionMap.class); + private boolean checkAnalyzed_ = true; private List lhs_; // left-hand side private List rhs_; // right-hand side @@ -47,6 +48,12 @@ public ExprSubstitutionMap() { this(Lists.newArrayList(), Lists.newArrayList()); } + // Only used to convert show statement to select statement + public ExprSubstitutionMap(boolean check_analyzed) { + this(Lists.newArrayList(), Lists.newArrayList()); + this.checkAnalyzed_ = false; + } + public ExprSubstitutionMap(List lhs, List rhs) { lhs_ = lhs; rhs_ = rhs; @@ -57,7 +64,8 @@ public ExprSubstitutionMap(List lhs, List rhs) { * across query blocks. It is not required that the lhsExpr is analyzed. */ public void put(Expr lhsExpr, Expr rhsExpr) { - Preconditions.checkState(rhsExpr.isAnalyzed(), "Rhs expr must be analyzed."); + Preconditions.checkState(!checkAnalyzed_ || rhsExpr.isAnalyzed(), + "Rhs expr must be analyzed."); lhs_.add(lhsExpr); rhs_.add(rhsExpr); } @@ -166,7 +174,7 @@ private void verify() { // Preconditions.checkState(false); } } - Preconditions.checkState(rhs_.get(i).isAnalyzed()); + Preconditions.checkState(!checkAnalyzed_ || rhs_.get(i).isAnalyzed()); } } diff --git a/fe/src/com/baidu/palo/analysis/ShowDbStmt.java b/fe/src/com/baidu/palo/analysis/ShowDbStmt.java index f0099bf69a7d86..7c8aedfdb79e2a 100644 --- a/fe/src/com/baidu/palo/analysis/ShowDbStmt.java +++ b/fe/src/com/baidu/palo/analysis/ShowDbStmt.java @@ -68,7 +68,7 @@ public SelectStmt toSelectStmt(Analyzer analyzer) { } // Columns SelectList selectList = new SelectList(); - ExprSubstitutionMap aliasMap = new ExprSubstitutionMap(); + ExprSubstitutionMap aliasMap = new ExprSubstitutionMap(false); SelectListItem item = new SelectListItem(new SlotRef(TABLE_NAME, "SCHEMA_NAME"), DB_COL); selectList.addItem(item); aliasMap.put(new SlotRef(null, DB_COL), item.getExpr().clone(null)); diff --git a/fe/src/com/baidu/palo/analysis/ShowTableStatusStmt.java b/fe/src/com/baidu/palo/analysis/ShowTableStatusStmt.java index 65269d13cbe2fc..a56281a7a85047 100644 --- a/fe/src/com/baidu/palo/analysis/ShowTableStatusStmt.java +++ b/fe/src/com/baidu/palo/analysis/ShowTableStatusStmt.java @@ -109,7 +109,7 @@ public SelectStmt toSelectStmt(Analyzer analyzer) throws AnalysisException { analyze(analyzer); // Columns SelectList selectList = new SelectList(); - ExprSubstitutionMap aliasMap = new ExprSubstitutionMap(); + ExprSubstitutionMap aliasMap = new ExprSubstitutionMap(false); // Name SelectListItem item = new SelectListItem(new SlotRef(TABLE_NAME, "TABLE_NAME"), "Name"); selectList.addItem(item); diff --git a/fe/src/com/baidu/palo/analysis/ShowTableStmt.java b/fe/src/com/baidu/palo/analysis/ShowTableStmt.java index 82fc07764b3b06..b79f0b584a6914 100644 --- a/fe/src/com/baidu/palo/analysis/ShowTableStmt.java +++ b/fe/src/com/baidu/palo/analysis/ShowTableStmt.java @@ -98,7 +98,7 @@ public SelectStmt toSelectStmt(Analyzer analyzer) throws AnalysisException { analyze(analyzer); // Columns SelectList selectList = new SelectList(); - ExprSubstitutionMap aliasMap = new ExprSubstitutionMap(); + ExprSubstitutionMap aliasMap = new ExprSubstitutionMap(false); SelectListItem item = new SelectListItem(new SlotRef(TABLE_NAME, "TABLE_NAME"), NAME_COL_PREFIX + ClusterNamespace.getDbNameFromFullName(db)); selectList.addItem(item); diff --git a/fe/src/com/baidu/palo/analysis/TableName.java b/fe/src/com/baidu/palo/analysis/TableName.java index 8698c0c9836161..8cff897b9a0b0b 100644 --- a/fe/src/com/baidu/palo/analysis/TableName.java +++ b/fe/src/com/baidu/palo/analysis/TableName.java @@ -88,6 +88,19 @@ public boolean isFullyQualified() { return db != null && !db.isEmpty() && !tbl.isEmpty(); } + public String getNoClusterString() { + if (db == null) { + return tbl; + } else { + String dbName = ClusterNamespace.getDbNameFromFullName(db); + if (dbName == null) { + return db + "." + tbl; + } else { + return dbName + "." + tbl; + } + } + } + @Override public String toString() { if (db == null) { diff --git a/fe/src/com/baidu/palo/service/FrontendServiceImpl.java b/fe/src/com/baidu/palo/service/FrontendServiceImpl.java index d46c4688e2f033..3af3f48dc45cfd 100644 --- a/fe/src/com/baidu/palo/service/FrontendServiceImpl.java +++ b/fe/src/com/baidu/palo/service/FrontendServiceImpl.java @@ -117,12 +117,13 @@ public TGetDbsResult getDbNames(TGetDbsParams params) throws TException { throw new TException("Pattern is in bad format " + params.getPattern()); } } - for (String db : dbNames) { + for (String fullName : dbNames) { + final String db = ClusterNamespace.getDbNameFromFullName(fullName); if (matcher != null && !matcher.match(db)) { continue; } - if (userPropertyMgr.checkAccess(params.user, db, AccessPrivilege.READ_ONLY)) { - dbs.add(db); + if (userPropertyMgr.checkAccess(params.user, fullName, AccessPrivilege.READ_ONLY)) { + dbs.add(fullName); } } result.setDbs(dbs);