From 65f9a2ff1450302c2c29e7c5da765ec79c02041d Mon Sep 17 00:00:00 2001 From: chenmingyu Date: Fri, 13 Apr 2018 21:34:10 +0800 Subject: [PATCH] fix left join bug, be compatible with sqlalchemy --- fe/src/com/baidu/palo/analysis/Analyzer.java | 2 +- .../com/baidu/palo/analysis/LiteralExpr.java | 8 ++++++- fe/src/com/baidu/palo/catalog/Catalog.java | 8 +++++-- fe/src/com/baidu/palo/catalog/Column.java | 4 +--- fe/src/com/baidu/palo/qe/StmtExecutor.java | 1 + gensrc/parser/sql_parser.y | 21 ++++++++++++++----- gensrc/parser/sql_scanner.flex | 1 + 7 files changed, 33 insertions(+), 12 deletions(-) diff --git a/fe/src/com/baidu/palo/analysis/Analyzer.java b/fe/src/com/baidu/palo/analysis/Analyzer.java index 303a61dfde74fb..751117bbda4604 100644 --- a/fe/src/com/baidu/palo/analysis/Analyzer.java +++ b/fe/src/com/baidu/palo/analysis/Analyzer.java @@ -1156,7 +1156,7 @@ public List getEqJoinConjuncts(TupleId id, TableRef rhsRef) { List ojClauseConjuncts = null; if (rhsRef != null) { Preconditions.checkState(rhsRef.getJoinOp().isOuterJoin()); - ojClauseConjuncts = globalState.conjunctsByOjClause.get(rhsRef); + ojClauseConjuncts = globalState.conjunctsByOjClause.get(rhsRef.getId()); } for (ExprId conjunctId : conjunctIds) { Expr e = globalState.conjuncts.get(conjunctId); diff --git a/fe/src/com/baidu/palo/analysis/LiteralExpr.java b/fe/src/com/baidu/palo/analysis/LiteralExpr.java index 6a3efeb690d3b8..991d18b6bb522d 100644 --- a/fe/src/com/baidu/palo/analysis/LiteralExpr.java +++ b/fe/src/com/baidu/palo/analysis/LiteralExpr.java @@ -183,7 +183,13 @@ public boolean equals(Object obj) { if (!(obj instanceof LiteralExpr)) { return false; } - + //TODO chenhao16, call super.equals() + if ((obj instanceof StringLiteral && !(this instanceof StringLiteral)) + || (this instanceof StringLiteral && !(obj instanceof StringLiteral)) + || (obj instanceof DecimalLiteral && !(this instanceof DecimalLiteral)) + || (this instanceof DecimalLiteral && !(obj instanceof DecimalLiteral))) { + return false; + } return this.compareLiteral(((LiteralExpr) obj)) == 0; } } diff --git a/fe/src/com/baidu/palo/catalog/Catalog.java b/fe/src/com/baidu/palo/catalog/Catalog.java index 59fa62b75c05b9..9c9865611d21db 100644 --- a/fe/src/com/baidu/palo/catalog/Catalog.java +++ b/fe/src/com/baidu/palo/catalog/Catalog.java @@ -3346,7 +3346,9 @@ public static void getDdlStmt(Table table, List createTableStmt, List colNames, List exprs) throws IOExcept } public void sendShowResult(ShowResultSet resultSet) throws IOException { + context.updateReturnRows(resultSet.getResultRows().size()); // Send meta data. sendMetaData(resultSet.getMetaData()); diff --git a/gensrc/parser/sql_parser.y b/gensrc/parser/sql_parser.y index 50d63761e55b26..75f12c446703be 100644 --- a/gensrc/parser/sql_parser.y +++ b/gensrc/parser/sql_parser.y @@ -220,7 +220,7 @@ terminal String KW_ADD, KW_AFTER, KW_AGGREGATE, KW_ALL, KW_ALTER, KW_AND, KW_ANT KW_RANDOM, KW_RANGE, KW_READ, KW_RECOVER, KW_REGEXP, KW_RELEASE, KW_RENAME, KW_REPEATABLE, KW_REPLACE, KW_RESOURCE, KW_RESTORE, KW_REVOKE, KW_RIGHT, KW_ROLLBACK, KW_ROLLUP, KW_ROW, KW_ROWS, - KW_SELECT, KW_SEMI, KW_SERIALIZABLE, KW_SESSION, KW_SET, KW_SHOW, + KW_SCHEMAS, KW_SELECT, KW_SEMI, KW_SERIALIZABLE, KW_SESSION, KW_SET, KW_SHOW, KW_SMALLINT, KW_SNAPSHOT, KW_SONAME, KW_SPLIT, KW_START, KW_STATUS, KW_STORAGE, KW_STRING, KW_SUM, KW_SUPERUSER, KW_SYNC, KW_SYSTEM, KW_TABLE, KW_TABLES, KW_TABLET, KW_TERMINATED, KW_THAN, KW_THEN, KW_TIMESTAMP, KW_TINYINT, @@ -255,7 +255,7 @@ nonterminal SelectStmt select_stmt; // No return. nonterminal describe_command, opt_full, opt_inner, opt_outer, from_or_in, keys_or_index, opt_storage, opt_wild_where, - charset, equal, transaction_characteristics, isolation_level, + charset, opt_charset_name, equal, transaction_characteristics, isolation_level, transaction_access_mode, isolation_types; // String @@ -1564,6 +1564,10 @@ show_param ::= {: RESULT = new ShowDbStmt(parser.wild, parser.where); :} + | KW_SCHEMAS opt_wild_where + {: + RESULT = new ShowDbStmt(parser.wild, parser.where); + :} /* Columns */ | opt_full KW_COLUMNS from_or_in table_name:table opt_db:db opt_wild_where {: @@ -1732,6 +1736,11 @@ old_or_new_charset_name_or_default ::= :} ; +opt_charset_name ::= + /* empty */ + | charset old_or_new_charset_name_or_default + ; + opt_collate ::= /* Empty */ {: @@ -2523,7 +2532,7 @@ select_sublist ::= ; select_list_item ::= - expr:expr select_alias:alias + expr:expr opt_collate:collate select_alias:alias {: RESULT = new SelectListItem(expr, alias); :} @@ -2843,6 +2852,10 @@ cast_expr ::= {: RESULT = new CastExpr(Type.fromPrimitiveType((PrimitiveType) targetType), e, false); :} | KW_CAST LPAREN expr:e KW_AS primitive_type:targetType LPAREN non_pred_expr:e1 RPAREN RPAREN {: RESULT = new CastExpr(Type.fromPrimitiveType((PrimitiveType) targetType), e, false); :} + | KW_CAST LPAREN expr:e KW_AS KW_CHAR opt_charset_name RPAREN + {: RESULT = new CastExpr(Type.fromPrimitiveType(PrimitiveType.VARCHAR), e, false); :} + | KW_CAST LPAREN expr:e KW_AS KW_CHAR LPAREN non_pred_expr:e1 RPAREN opt_charset_name RPAREN + {: RESULT = new CastExpr(Type.fromPrimitiveType(PrimitiveType.VARCHAR), e, false); :} ; case_expr ::= @@ -3271,8 +3284,6 @@ column_ref ::= primitive_type ::= KW_TINYINT {: RESULT = PrimitiveType.TINYINT; :} - | KW_CHAR - {: RESULT = PrimitiveType.VARCHAR; :} | KW_SMALLINT {: RESULT = PrimitiveType.SMALLINT; :} | KW_INT diff --git a/gensrc/parser/sql_scanner.flex b/gensrc/parser/sql_scanner.flex index 1285adacdd780a..8e37293ebc459f 100644 --- a/gensrc/parser/sql_scanner.flex +++ b/gensrc/parser/sql_scanner.flex @@ -244,6 +244,7 @@ import com.baidu.palo.common.util.SqlUtils; keywordMap.put("rollup", new Integer(SqlParserSymbols.KW_ROLLUP)); keywordMap.put("row", new Integer(SqlParserSymbols.KW_ROW)); keywordMap.put("rows", new Integer(SqlParserSymbols.KW_ROWS)); + keywordMap.put("schemas", new Integer(SqlParserSymbols.KW_SCHEMAS)); keywordMap.put("select", new Integer(SqlParserSymbols.KW_SELECT)); keywordMap.put("semi", new Integer(SqlParserSymbols.KW_SEMI)); keywordMap.put("serializable", new Integer(SqlParserSymbols.KW_SERIALIZABLE));