[bug](prepared statement) fix prepared statement throw exception when inserting null value (#36484)

## Proposed changes

bp #36426

<!--Describe your changes.-->
This commit is contained in:
xy720
2024-06-20 11:31:59 +08:00
committed by GitHub
parent 9c1f34359d
commit c5bb0e3a21
6 changed files with 41 additions and 9 deletions

View File

@ -59,6 +59,20 @@ public class PlaceHolderExpr extends LiteralExpr {
this.type = literal.getType();
}
public LiteralExpr getLiteral() {
return lExpr;
}
@Override
protected void analysisDone() {
if (lExpr != null && !lExpr.isAnalyzed) {
lExpr.analysisDone();
}
if (!isAnalyzed) {
super.analysisDone();
}
}
public LiteralExpr createLiteralFromType() throws AnalysisException {
Preconditions.checkState(mysqlTypeCode > 0);
return LiteralExpr.getLiteralByMysqlType(mysqlTypeCode, isUnsigned());
@ -135,11 +149,6 @@ public class PlaceHolderExpr extends LiteralExpr {
return "?";
}
@Override
protected Expr uncheckedCastTo(Type targetType) throws AnalysisException {
return this.lExpr.uncheckedCastTo(targetType);
}
// Swaps the sign of numeric literals.
// Throws for non-numeric literals.
public void swapSign() throws NotImplementedException {

View File

@ -268,6 +268,7 @@ public class PrepareStmt extends StatementBase {
}
for (int i = 0; i < values.size(); ++i) {
inner.getPlaceHolders().get(i).setLiteral(values.get(i));
inner.getPlaceHolders().get(i).analysisDone();
}
if (!values.isEmpty()) {
if (LOG.isDebugEnabled()) {

View File

@ -29,6 +29,7 @@ import org.apache.doris.analysis.InPredicate;
import org.apache.doris.analysis.IsNullPredicate;
import org.apache.doris.analysis.LiteralExpr;
import org.apache.doris.analysis.NullLiteral;
import org.apache.doris.analysis.PlaceHolderExpr;
import org.apache.doris.analysis.PredicateUtils;
import org.apache.doris.analysis.SlotDescriptor;
import org.apache.doris.analysis.SlotId;
@ -399,7 +400,8 @@ public abstract class ScanNode extends PlanNode implements SplitGenerator {
if (null == partitionColumnFilter) {
partitionColumnFilter = new PartitionColumnFilter();
}
LiteralExpr literal = (LiteralExpr) slotBinding;
LiteralExpr literal = slotBinding instanceof PlaceHolderExpr
? ((PlaceHolderExpr) slotBinding).getLiteral() : (LiteralExpr) slotBinding;
BinaryPredicate.Operator op = binPredicate.getOp();
if (!binPredicate.slotIsLeft()) {
op = op.commutative();

View File

@ -23,6 +23,7 @@ import org.apache.doris.analysis.CastExpr;
import org.apache.doris.analysis.Expr;
import org.apache.doris.analysis.InPredicate;
import org.apache.doris.analysis.LiteralExpr;
import org.apache.doris.analysis.PlaceHolderExpr;
import org.apache.doris.analysis.SlotRef;
import org.apache.doris.analysis.Subquery;
import org.apache.doris.catalog.Type;
@ -114,7 +115,11 @@ public class RewriteInPredicateRule implements ExprRewriteRule {
// For example, 2.1 is converted to 2;
// 3. childExpr is precisely converted to column type. For example, 2.0 is converted to 2.
// In cases 1 and 2 above, childExpr should be discarded.
LiteralExpr newExpr = (LiteralExpr) childExpr.castTo(columnType);
Expr tmpExpr = childExpr.castTo(columnType);
if (tmpExpr instanceof CastExpr && tmpExpr.getChild(0) instanceof PlaceHolderExpr) {
tmpExpr = ((PlaceHolderExpr) tmpExpr.getChild(0)).getLiteral().castTo(columnType);
}
LiteralExpr newExpr = (LiteralExpr) tmpExpr;
if (childExpr.compareLiteral(newExpr) == 0) {
isCast = true;
newInList.add(newExpr);