📄 function.java
字号:
v0 = v0.convertScale(mode.convertOnlyToSmallerScale, scale);
v0 = v0.convertPrecision(getPrecision());
result = v0;
break;
}
case MEMORY_FREE:
session.getUser().checkAdmin();
result = ValueInt.get(MemoryUtils.getMemoryFree());
break;
case MEMORY_USED:
session.getUser().checkAdmin();
result = ValueInt.get(MemoryUtils.getMemoryUsed());
break;
case LOCK_MODE:
result = ValueInt.get(database.getLockMode());
break;
case SCHEMA:
result = ValueString.get(session.getCurrentSchemaName());
break;
case SESSION_ID:
result = ValueInt.get(session.getId());
break;
case IFNULL: {
result = v0 == ValueNull.INSTANCE ? args[1].getValue(session) : v0;
break;
}
case CASEWHEN: {
Expression expr;
if (v0 == ValueNull.INSTANCE || !v0.getBoolean().booleanValue()) {
expr = args[2];
} else {
expr = args[1];
}
Value v = expr.getValue(session);
result = v.convertTo(dataType);
break;
}
case COALESCE: {
result = v0;
for (int i = 0; i < args.length; i++) {
Value v = i == 0 ? v0 : args[i].getValue(session);
if (!(v == ValueNull.INSTANCE)) {
result = v.convertTo(dataType);
break;
}
}
break;
}
case GREATEST:
case LEAST: {
result = ValueNull.INSTANCE;
for (int i = 0; i < args.length; i++) {
Value v = i == 0 ? v0 : args[i].getValue(session);
if (!(v == ValueNull.INSTANCE)) {
v = v.convertTo(dataType);
if (result == ValueNull.INSTANCE) {
result = v;
} else {
int comp = database.compareTypeSave(result, v);
if (info.type == GREATEST && comp < 0) {
result = v;
} else if (info.type == LEAST && comp > 0) {
result = v;
}
}
}
}
break;
}
case CASE: {
result = null;
int i = 0;
for (; i < args.length; i++) {
Value when = args[i++].getValue(session);
if (Boolean.TRUE.equals(when)) {
result = args[i].getValue(session);
break;
}
}
if (result == null) {
result = i < args.length ? args[i].getValue(session) : ValueNull.INSTANCE;
}
break;
}
case ARRAY_GET: {
if (v0.getType() == Value.ARRAY) {
Value v1 = args[1].getValue(session);
int element = v1.getInt();
Value[] list = ((ValueArray) v0).getList();
if (element < 1 || element > list.length) {
result = ValueNull.INSTANCE;
} else {
result = list[element - 1];
}
} else {
result = ValueNull.INSTANCE;
}
break;
}
case ARRAY_LENGTH: {
if (v0.getType() == Value.ARRAY) {
Value[] list = ((ValueArray) v0).getList();
result = ValueInt.get(list.length);
} else {
result = ValueNull.INSTANCE;
}
break;
}
case CANCEL_SESSION: {
result = ValueBoolean.get(cancelStatement(session, v0.getInt()));
break;
}
default:
result = null;
}
return result;
}
private boolean cancelStatement(Session session, int targetSessionId) throws SQLException {
session.getUser().checkAdmin();
Session[] sessions = session.getDatabase().getSessions();
for (int i = 0; i < sessions.length; i++) {
Session s = sessions[i];
if (s.getId() == targetSessionId) {
Command c = s.getCurrentCommand();
if (c == null) {
return false;
} else {
c.cancel();
return true;
}
}
}
return false;
}
public Value getValueWithArgs(Session session, Expression[] args) throws SQLException {
if (info.nullIfParameterIsNull) {
for (int i = 0; i < args.length; i++) {
if (getNullOrValue(session, args, i) == ValueNull.INSTANCE) {
return ValueNull.INSTANCE;
}
}
}
Value v0 = getNullOrValue(session, args, 0);
Value resultSimple = getSimpleValue(session, v0, args);
if (resultSimple != null) {
return resultSimple;
}
Value v1 = getNullOrValue(session, args, 1);
Value v2 = getNullOrValue(session, args, 2);
Value v3 = getNullOrValue(session, args, 3);
Value v4 = getNullOrValue(session, args, 4);
Value v5 = getNullOrValue(session, args, 5);
Value result;
switch (info.type) {
case ATAN2:
result = ValueDouble.get(Math.atan2(v0.getDouble(), v1.getDouble()));
break;
case BITAND:
result = ValueInt.get(v0.getInt() & v1.getInt());
break;
case BITOR:
result = ValueInt.get(v0.getInt() | v1.getInt());
break;
case BITXOR:
result = ValueInt.get(v0.getInt() ^ v1.getInt());
break;
case MOD: {
int x = v1.getInt();
if (x == 0.0) {
throw Message.getSQLException(ErrorCode.DIVISION_BY_ZERO_1, getSQL());
}
result = ValueInt.get(v0.getInt() % x);
break;
}
case POWER:
result = ValueDouble.get(Math.pow(v0.getDouble(), v1.getDouble()));
break;
case ROUND: {
double f = Math.pow(10., v1.getDouble());
result = ValueDouble.get(Math.round(v0.getDouble() * f) / f);
break;
}
case TRUNCATE: {
double d = v0.getDouble();
int p = v1.getInt();
double f = Math.pow(10., p);
double g = d * f;
result = ValueDouble.get(((d < 0) ? Math.ceil(g) : Math.floor(g)) / f);
break;
}
case HASH:
result = ValueBytes.getNoCopy(getHash(v0.getString(), v1.getBytesNoCopy(), v2.getInt()));
break;
case ENCRYPT:
result = ValueBytes.getNoCopy(encrypt(v0.getString(), v1.getBytesNoCopy(), v2.getBytesNoCopy()));
break;
case DECRYPT:
result = ValueBytes.getNoCopy(decrypt(v0.getString(), v1.getBytesNoCopy(), v2.getBytesNoCopy()));
break;
case COMPRESS: {
String algorithm = null;
if (v1 != null) {
algorithm = v1.getString();
}
result = ValueBytes.getNoCopy(CompressTool.getInstance().compress(v0.getBytesNoCopy(), algorithm));
break;
}
case DIFFERENCE:
result = ValueInt.get(getDifference(v0.getString(), v1.getString()));
break;
case INSERT: {
if (v1 == ValueNull.INSTANCE || v2 == ValueNull.INSTANCE) {
result = v1;
} else {
result = ValueString.get(insert(v0.getString(), v1.getInt(), v2.getInt(), v3.getString()));
}
break;
}
case LEFT:
result = ValueString.get(left(v0.getString(), v1.getInt()));
break;
case LOCATE: {
int start = v2 == null ? 0 : v2.getInt();
result = ValueInt.get(locate(v0.getString(), v1.getString(), start));
break;
}
case INSTR: {
int start = v2 == null ? 0 : v2.getInt();
result = ValueInt.get(locate(v1.getString(), v0.getString(), start));
break;
}
case REPEAT: {
int count = Math.max(0, v1.getInt());
result = ValueString.get(repeat(v0.getString(), count));
break;
}
case REPLACE: {
String s0 = v0 == ValueNull.INSTANCE ? "" : v0.getString();
String s1 = v1 == ValueNull.INSTANCE ? "" : v1.getString();
String s2 = (v2 == null || v2 == ValueNull.INSTANCE) ? "" : v2.getString();
result = ValueString.get(replace(s0, s1, s2));
break;
}
case RIGHT:
result = ValueString.get(right(v0.getString(), v1.getInt()));
break;
case LTRIM:
result = ValueString.get(trim(v0.getString(), true, false, v1 == null ? " " : v1.getString()));
break;
case TRIM:
result = ValueString.get(trim(v0.getString(), true, true, v1 == null ? " " : v1.getString()));
break;
case RTRIM:
result = ValueString.get(trim(v0.getString(), false, true, v1 == null ? " " : v1.getString()));
break;
case SUBSTR:
case SUBSTRING: {
String s = v0.getString();
int length = v2 == null ? s.length() : v2.getInt();
result = ValueString.get(substring(s, v1.getInt(), length));
break;
}
case POSITION:
result = ValueInt.get(locate(v0.getString(), v1.getString(), 0));
break;
case XMLATTR:
result = ValueString.get(StringUtils.xmlAttr(v0.getString(), v1.getString()));
break;
case XMLNODE: {
String attr = v1 == null ? null : v1 == ValueNull.INSTANCE ? null : v1.getString();
String content = v2 == null ? null : v2 == ValueNull.INSTANCE ? null : v2.getString();
result = ValueString.get(StringUtils.xmlNode(v0.getString(), attr, content));
break;
}
case REGEXP_REPLACE: {
String regexp = v1.getString();
try {
result = ValueString.get(v0.getString().replaceAll(regexp, v2.getString()));
} catch (PatternSyntaxException e) {
throw Message.getSQLException(ErrorCode.LIKE_ESCAPE_ERROR_1, new String[]{regexp}, e);
}
break;
}
case RPAD:
result = ValueString.get(StringUtils.pad(v0.getString(), v1.getInt(), v2 == null ? null : v2.getString(), true));
break;
case LPAD:
result = ValueString.get(StringUtils.pad(v0.getString(), v1.getInt(), v2 == null ? null : v2.getString(), false));
break;
// date
case DATEADD:
result = ValueTimestamp.getNoCopy(dateadd(v0.getString(), v1.getInt(), v2.getTimestampNoCopy()));
break;
case DATEDIFF:
result = ValueLong.get(datediff(v0.getString(), v1.getTimestampNoCopy(), v2.getTimestampNoCopy()));
break;
case EXTRACT: {
int field = getDatePart(v0.getString());
result = ValueInt.get(getDatePart(v1.getTimestamp(), field));
break;
}
case FORMATDATETIME: {
if (v0 == ValueNull.INSTANCE || v1 == ValueNull.INSTANCE) {
result = ValueNull.INSTANCE;
} else {
String locale = v2 == null ? null : v2 == ValueNull.INSTANCE ? null : v2.getString();
String tz = v3 == null ? null : v3 == ValueNull.INSTANCE ? null : v3.getString();
result = ValueString.get(StringUtils.formatDateTime(v0.getTimestamp(), v1.getString(), locale, tz));
}
break;
}
case PARSEDATETIME: {
if (v0 == ValueNull.INSTANCE || v1 == ValueNull.INSTANCE) {
result = ValueNull.INSTANCE;
} else {
String locale = v2 == null ? null : v2 == ValueNull.INSTANCE ? null : v2.getString();
String tz = v3 == null ? null : v3 == ValueNull.INSTANCE ? null : v3.getString();
java.util.Date d = StringUtils.parseDateTime(v0.getString(), v1.getString(), locale, tz);
result = ValueTimestamp.getNoCopy(new Timestamp(d.getTime()));
}
break;
}
case NULLIF:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -