Skip to content

Commit e048428

Browse files
committed
[expr] Add coding of functions SUBSTR, MID.
1 parent f5c16cd commit e048428

5 files changed

Lines changed: 53 additions & 4 deletions

File tree

coding/src/main/java/io/dingodb/expr/coding/ExprCoder.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,9 +280,22 @@ public CodingFlag visitBinaryOpExpr(@NonNull BinaryOpExpr expr, OutputStream obj
280280
return null;
281281
}
282282

283+
@SneakyThrows
283284
@Override
284285
public CodingFlag visitTertiaryOpExpr(@NonNull TertiaryOpExpr expr, @NonNull OutputStream obj) {
285-
return super.visitTertiaryOpExpr(expr, obj);
286+
if (visit(expr.getOperand0(), obj) == OK
287+
&& visit(expr.getOperand1(), obj) == OK
288+
&& visit(expr.getOperand2(), obj) == OK
289+
) {
290+
boolean success = false;
291+
if (expr.getOpType() == OpType.FUN) {
292+
success = writeFun(obj, FunIndex.getTertiary(expr.getOp()));
293+
}
294+
if (success) {
295+
return OK;
296+
}
297+
}
298+
return null;
286299
}
287300

288301
@SneakyThrows

coding/src/main/java/io/dingodb/expr/coding/FunIndex.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.dingodb.expr.coding;
1818

1919
import io.dingodb.expr.runtime.op.BinaryOp;
20+
import io.dingodb.expr.runtime.op.TertiaryOp;
2021
import io.dingodb.expr.runtime.op.UnaryOp;
2122
import io.dingodb.expr.runtime.op.mathematical.AcosFunFactory;
2223
import io.dingodb.expr.runtime.op.mathematical.AsinFunFactory;
@@ -35,8 +36,12 @@
3536
import io.dingodb.expr.runtime.op.string.LTrimFunFactory;
3637
import io.dingodb.expr.runtime.op.string.LeftFunFactory;
3738
import io.dingodb.expr.runtime.op.string.LowerFunFactory;
39+
import io.dingodb.expr.runtime.op.string.Mid2FunFactory;
40+
import io.dingodb.expr.runtime.op.string.Mid3FunFactory;
3841
import io.dingodb.expr.runtime.op.string.RTrimFunFactory;
3942
import io.dingodb.expr.runtime.op.string.RightFunFactory;
43+
import io.dingodb.expr.runtime.op.string.Substr2FunFactory;
44+
import io.dingodb.expr.runtime.op.string.Substr3FunFactory;
4045
import io.dingodb.expr.runtime.op.string.TrimFunFactory;
4146
import io.dingodb.expr.runtime.op.string.UpperFunFactory;
4247
import io.dingodb.expr.runtime.type.Types;
@@ -133,6 +138,28 @@ static int getBinary(@NonNull BinaryOp op) {
133138
case RightFunFactory.NAME:
134139
funIndex = 0x25;
135140
break;
141+
case Substr2FunFactory.NAME:
142+
funIndex = 0x2D;
143+
break;
144+
case Mid2FunFactory.NAME:
145+
funIndex = 0x2F;
146+
break;
147+
default:
148+
break;
149+
}
150+
return funIndex;
151+
}
152+
153+
static int getTertiary(@NonNull TertiaryOp op) {
154+
String funName = op.getName();
155+
int funIndex = -1;
156+
switch (funName) {
157+
case Substr3FunFactory.NAME:
158+
funIndex = 0x2C;
159+
break;
160+
case Mid3FunFactory.NAME:
161+
funIndex = 0x2E;
162+
break;
136163
default:
137164
break;
138165
}

runtime/src/main/java/io/dingodb/expr/runtime/op/string/Substr2Fun.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ abstract class Substr2Fun extends BinaryStringIntFun {
2626
private static final long serialVersionUID = 992163045871277543L;
2727

2828
static @NonNull String substr(@NonNull String value0, int start) {
29-
return value0.substring(start);
29+
if (start < 0) {
30+
start = 0;
31+
}
32+
return (start == 0) ? value0 : value0.substring(start);
3033
}
3134

3235
@Override

runtime/src/main/java/io/dingodb/expr/runtime/op/string/Substr3Fun.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,13 @@ abstract class Substr3Fun extends TertiaryStringIntIntFun {
2626
private static final long serialVersionUID = -5730776211565201950L;
2727

2828
static @NonNull String substr(@NonNull String value0, int start, int end) {
29-
return value0.substring(start, end);
29+
if (start < 0) {
30+
start = 0;
31+
}
32+
if (start == 0) {
33+
return end >= value0.length() ? value0 : value0.substring(start, end);
34+
}
35+
return end >= value0.length() ? value0.substring(start) : value0.substring(start, end);
3036
}
3137

3238
@Override

0 commit comments

Comments
 (0)