Skip to content

Commit

Permalink
fix mysql type mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
Jay-ju committed Sep 7, 2023
1 parent b407652 commit 9f4464d
Show file tree
Hide file tree
Showing 9 changed files with 62 additions and 46 deletions.
31 changes: 14 additions & 17 deletions fe/fe-core/src/main/java/com/starrocks/analysis/LiteralExpr.java
Original file line number Diff line number Diff line change
Expand Up @@ -265,20 +265,19 @@ public static LiteralExpr parseLiteral(int encode) throws AnalysisException {
}
}

private static LiteralExpr tinyIntExpr;
private static LiteralExpr smallIntExpr;
private static LiteralExpr intExpr;
private static LiteralExpr bigIntExpr;
private static LiteralExpr floatExpr;
private static LiteralExpr doubleExpr;
private static LiteralExpr decimal32Expr;
private static LiteralExpr timeExpr;
private static LiteralExpr dateExpr;
private static LiteralExpr dateTimeExpr;
private static LiteralExpr stringExpr;
private static LiteralExpr varcharExpr;

{
private static final LiteralExpr tinyIntExpr;
private static final LiteralExpr smallIntExpr;
private static final LiteralExpr intExpr;
private static final LiteralExpr bigIntExpr;
private static final LiteralExpr floatExpr;
private static final LiteralExpr doubleExpr;
private static final LiteralExpr decimal32Expr;
private static final LiteralExpr dateExpr;
private static final LiteralExpr dateTimeExpr;
private static final LiteralExpr stringExpr;
private static final LiteralExpr varcharExpr;

static {
try {
tinyIntExpr = LiteralExpr.create("0", Type.TINYINT);
smallIntExpr = LiteralExpr.create("0", Type.SMALLINT);
Expand All @@ -287,7 +286,6 @@ public static LiteralExpr parseLiteral(int encode) throws AnalysisException {
floatExpr = LiteralExpr.create("0", Type.FLOAT);
doubleExpr = LiteralExpr.create("0", Type.DOUBLE);
decimal32Expr = LiteralExpr.create("0", Type.DECIMAL32);
timeExpr = LiteralExpr.create("", Type.TIME);
dateExpr = LiteralExpr.create("1970-01-01", Type.DATE);
dateTimeExpr = LiteralExpr.create("1970-01-01 00:00:00", Type.DATETIME);
stringExpr = LiteralExpr.create("", Type.STRING);
Expand All @@ -297,7 +295,7 @@ public static LiteralExpr parseLiteral(int encode) throws AnalysisException {
}
}

private static Map<Integer, LiteralExpr> MYSQL_LITERAL_TYPE_ENCODE_MAP = Maps.of(
private static final Map<Integer, LiteralExpr> MYSQL_LITERAL_TYPE_ENCODE_MAP = Maps.of(
0, decimal32Expr, // MYSQL_TYPE_DECIMAL
1, tinyIntExpr, // MYSQL_TYPE_TINY
2, smallIntExpr, // MYSQL_TYPE_SHORT
Expand All @@ -307,7 +305,6 @@ public static LiteralExpr parseLiteral(int encode) throws AnalysisException {
7, dateTimeExpr, // MYSQL_TYPE_TIMESTAMP2
8, bigIntExpr, // MYSQL_TYPE_LONGLONG
10, dateExpr, // MYSQL_TYPE_DATE
11, timeExpr, // MYSQL_TYPE_TIME
12, dateTimeExpr, // MYSQL_TYPE_DATETIME
15, varcharExpr, // MYSQL_TYPE_VARCHAR
17, dateTimeExpr, // MYSQL_TYPE_TIMESTAMP2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
import com.starrocks.sql.analyzer.AstToStringBuilder;
import com.starrocks.sql.ast.ExecuteStmt;
import com.starrocks.sql.ast.KillStmt;
import com.starrocks.sql.ast.PrepareStmt;
import com.starrocks.sql.ast.QueryStatement;
import com.starrocks.sql.ast.StatementBase;
import com.starrocks.sql.ast.UserIdentity;
Expand Down Expand Up @@ -350,6 +351,10 @@ protected void handleQuery() {
ctx.setQueryId(UUIDUtil.genUUID());
}
parsedStmt = stmts.get(i);
//JDBC has no prepared prefix, only
if (ctx.getCommand() == MysqlCommand.COM_STMT_PREPARE && (parsedStmt instanceof PrepareStmt)) {
((PrepareStmt) parsedStmt).setName(String.valueOf(ctx.getStmtId()));
}
parsedStmt.setOrigStmt(new OriginStatement(originStmt, i));

// Only add the last running stmt for multi statement,
Expand Down
6 changes: 3 additions & 3 deletions fe/fe-core/src/main/java/com/starrocks/qe/StmtExecutor.java
Original file line number Diff line number Diff line change
Expand Up @@ -1482,7 +1482,7 @@ private void handleDeallocateStmt() throws Exception {
DeallocateStmt deallocateStmt = (DeallocateStmt) parsedStmt;
String stmtName = deallocateStmt.getStmtName();
if (context.getPreparedStmt(stmtName) == null) {
throw new Exception("PrepareStatement `" + stmtName + "` not exist");
throw new UserException("PrepareStatement `" + stmtName + "` not exist");
}
context.removePreparedStmt(stmtName);
context.getState().setOk();
Expand All @@ -1492,7 +1492,7 @@ private void handlePrepareStmt(ExecPlan execPlan) throws Exception {
PrepareStmt prepareStmt = (PrepareStmt) parsedStmt;
boolean isBinaryRowFormat = context.getCommand() == MysqlCommand.COM_STMT_PREPARE;
// register prepareStmt
LOG.info("add prepared statement {}, isBinaryProtocol {}", prepareStmt.getName(), isBinaryRowFormat);
LOG.debug("add prepared statement {}, isBinaryProtocol {}", prepareStmt.getName(), isBinaryRowFormat);
context.putPreparedStmt(prepareStmt.getName(), new PrepareStmtContext(prepareStmt, context, execPlan));
if (isBinaryRowFormat) {
sendStmtPrepareOK(prepareStmt);
Expand All @@ -1517,7 +1517,7 @@ private void sendStmtPrepareOK(PrepareStmt prepareStmt) throws IOException {
context.getMysqlChannel().sendOnePacket(serializer.toByteBuffer());
if (numParams > 0) {
List<String> colNames = prepareStmt.getParameterLabels();
List<Parameter> parameters = parsedStmt.getParameters();
List<Parameter> parameters = prepareStmt.getParameters();
for (int i = 0; i < colNames.size(); ++i) {
serializer.reset();
serializer.writeField(colNames.get(i), parameters.get(i).getType());
Expand Down
16 changes: 12 additions & 4 deletions fe/fe-core/src/main/java/com/starrocks/sql/ast/PrepareStmt.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,12 @@
import java.util.List;

public class PrepareStmt extends StatementBase {
private final String name;
private String name;

private final StatementBase innerStmt;

protected List<Parameter> parameters;

public PrepareStmt(String name, StatementBase stmt, List<Parameter> parameters) {
super(NodePosition.ZERO);
this.name = name;
Expand All @@ -44,10 +46,16 @@ public String getName() {
return name;
}

@Override
public void setName(String name) {
this.name = name;
}

public List<Parameter> getParameters() {
return parameters;
}

public void setParameters(List<Parameter> parameters) {
Preconditions.checkArgument(parameters == null || parameters == this.parameters,
"The placeHolders of PrepareStmt is already set.");
this.parameters = parameters;
}

public StatementBase assignValues(List<Expr> values) {
Expand Down
14 changes: 0 additions & 14 deletions fe/fe-core/src/main/java/com/starrocks/sql/ast/StatementBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,11 @@
package com.starrocks.sql.ast;

import com.google.common.base.Preconditions;
import com.starrocks.analysis.Parameter;
import com.starrocks.analysis.ParseNode;
import com.starrocks.analysis.RedirectStatus;
import com.starrocks.qe.OriginStatement;
import com.starrocks.sql.parser.NodePosition;

import java.util.List;

public abstract class StatementBase implements ParseNode {

private final NodePosition pos;
Expand Down Expand Up @@ -71,9 +68,6 @@ public enum ExplainLevel {
// Original statement to further usage, eg: enable_sql_blacklist.
protected OriginStatement origStmt;

// use for prepareStmt
protected List<Parameter> parameters;

public void setIsExplain(boolean isExplain, ExplainLevel explainLevel) {
this.isExplain = isExplain;
this.explainLevel = explainLevel;
Expand Down Expand Up @@ -107,14 +101,6 @@ public OriginStatement getOrigStmt() {
return origStmt;
}

public List<Parameter> getParameters() {
return parameters;
}

public void setParameters(List<Parameter> parameters) {
this.parameters = parameters;
}

// Override this method and return true
// if the stmt contains some information which need to be encrypted in audit log
public boolean needAuditEncryption() {
Expand Down
17 changes: 12 additions & 5 deletions fe/fe-core/src/main/java/com/starrocks/sql/parser/AstBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -6551,16 +6551,23 @@ public ParseNode visitUserWithoutHost(StarRocksParser.UserWithoutHostContext con
@Override
public ParseNode visitPrepareStatement(StarRocksParser.PrepareStatementContext context) {
String stmtName = context.identifier().getText();
StatementBase statement = null;
if (context.prepareSql().statement() != null) {
StatementBase statement = (StatementBase) visitStatement(context.prepareSql().statement());
statement = (StatementBase) visitStatement(context.prepareSql().statement());
return new PrepareStmt(stmtName, statement, parameters);
} else if (context.prepareSql().SINGLE_QUOTED_TEXT() != null) {
String sql = context.prepareSql().SINGLE_QUOTED_TEXT().getText();
StatementBase statement = SqlParser.parseSingleStatement(sql.substring(1, sql.length() - 1), sqlMode);
return new PrepareStmt(stmtName, statement, statement.getParameters());
} else {
throw new ParsingException("error prepare sql");
statement = SqlParser.parseSingleStatement(sql.substring(1, sql.length() - 1), sqlMode);
if (null != statement && statement instanceof PrepareStmt) {
PrepareStmt prepareStmt = (PrepareStmt) statement;
return new PrepareStmt(stmtName, prepareStmt.getInnerStmt(), prepareStmt.getParameters());
} else {
// prepare stm1 from select * from t1, no parameters
return new PrepareStmt(stmtName, statement, ImmutableList.of());
}
}

throw new ParsingException("error prepare sql");
}

@Override
Expand Down
13 changes: 10 additions & 3 deletions fe/fe-core/src/main/java/com/starrocks/sql/parser/SqlParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import com.starrocks.qe.OriginStatement;
import com.starrocks.qe.SessionVariable;
import com.starrocks.sql.ast.ImportColumnsStmt;
import com.starrocks.sql.ast.PrepareStmt;
import com.starrocks.sql.ast.StatementBase;
import io.trino.sql.parser.ParsingException;
import io.trino.sql.parser.StatementSplitter;
Expand Down Expand Up @@ -101,9 +102,15 @@ private static List<StatementBase> parseWithStarRocksDialect(String sql, Session
List<StarRocksParser.SingleStatementContext> singleStatementContexts =
parser.sqlStatements().singleStatement();
for (int idx = 0; idx < singleStatementContexts.size(); ++idx) {
StatementBase statement = (StatementBase) new AstBuilder(sessionVariable.getSqlMode())
.visitSingleStatement(singleStatementContexts.get(idx));
statement.setOrigStmt(new OriginStatement(sql, idx));
AstBuilder astBuilder = new AstBuilder(sessionVariable.getSqlMode());
StatementBase statement = (StatementBase) astBuilder.visitSingleStatement(singleStatementContexts.get(idx));
if (astBuilder.getParameters() != null && astBuilder.getParameters().size() != 0
&& !(statement instanceof PrepareStmt)) {
// for prepare stm1 from '', here statement is inner statement
statement = new PrepareStmt("", statement, astBuilder.getParameters());
} else {
statement.setOrigStmt(new OriginStatement(sql, idx));
}
statements.add(statement);
}
if (ConnectContext.get() != null) {
Expand Down
3 changes: 3 additions & 0 deletions test/sql/test_preparestatement/R/test_preprare_statement
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,6 @@ k1 k2 k3 k4 k5 v6 v7 v8 v9 v10 v11
k1 k2 k3 k4 k5 v6 v7 v8 v9 v10 v11
1 1 1 1 1 1 2021-02-01 2 2021-02-01 00:00:12 2 1.00
2 1 1 1 1 1 2021-02-01 1 2021-02-01 00:00:12 1 1.00
k1 k2 k3 k4 k5 v6 v7 v8 v9 v10 v11
1 1 1 1 1 1 2021-02-01 2 2021-02-01 00:00:12 2 1.00
2 1 1 1 1 1 2021-02-01 1 2021-02-01 00:00:12 1 1.00
3 changes: 3 additions & 0 deletions test/sql/test_preparestatement/T/test_preprare_statement
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ PREPARE stmt1 FROM insert into demo.prepare_stmt values (?, ?, ?, ?, ?, ?, ?, ?,
PREPARE stmt2 FROM select * from demo.prepare_stmt where k1 = ? and k2 = ?;
PREPARE stmt3 FROM 'update demo.prepare_stmt set v8 = ?, v10 = ? where k1 = ? and k2 = ?';
PREPARE stmt4 FROM 'select * from demo.prepare_stmt';
PREPARE stmt5 FROM select * from demo.prepare_stmt;

set @i = 1;
set @i2 = 2;
Expand All @@ -37,10 +38,12 @@ execute stmt2 using @i2, @i;
execute stmt3 using @v2, @v2, @i, @i;

execute stmt4;
execute stmt5;

drop prepare stmt1;
drop prepare stmt2;
drop prepare stmt3;
deallocate prepare stmt4; -- deallocate is alias
drop prepare stmt5;

DROP TABLE demo.prepare_stmt FORCE;

0 comments on commit 9f4464d

Please sign in to comment.