[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:
@ -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 {
|
||||
|
||||
@ -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()) {
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user