📄 function.java
字号:
result = database.areEqual(v0, v1) ? ValueNull.INSTANCE : v0;
break;
// system
case NEXTVAL: {
Sequence sequence = getSequence(session, v0, v1);
SequenceValue value = new SequenceValue(sequence);
result = value.getValue(session);
break;
}
case CURRVAL: {
Sequence sequence = getSequence(session, v0, v1);
result = ValueLong.get(sequence.getCurrentValue());
break;
}
case CSVREAD: {
String fileName = v0.getString();
String columnList = v1 == null ? null : v1.getString();
String charset = v2 == null ? null : v2.getString();
String fieldSeparatorRead = v3 == null ? null : v3.getString();
String fieldDelimiter = v4 == null ? null : v4.getString();
String escapeCharacter = v5 == null ? null : v5.getString();
Value v6 = getNullOrValue(session, args, 6);
String nullString = v6 == null ? null : v6.getString();
Csv csv = Csv.getInstance();
setCsvDelimiterEscape(csv, fieldSeparatorRead, fieldDelimiter, escapeCharacter);
csv.setNullString(nullString);
char fieldSeparator = csv.getFieldSeparatorRead();
String[] columns = StringUtils.arraySplit(columnList, fieldSeparator, true);
ValueResultSet vr = ValueResultSet.get(csv.read(fileName, columns, charset));
result = vr;
break;
}
case LINK_SCHEMA: {
session.getUser().checkAdmin();
Connection conn = session.createConnection(false);
ResultSet rs = LinkSchema.linkSchema(conn, v0.getString(), v1.getString(), v2.getString(), v3.getString(),
v4.getString(), v5.getString());
result = ValueResultSet.get(rs);
break;
}
case CSVWRITE: {
session.getUser().checkAdmin();
Connection conn = session.createConnection(false);
String charset = v2 == null ? null : v2.getString();
String fieldSeparatorWrite = v3 == null ? null : v3.getString();
String fieldDelimiter = v4 == null ? null : v4.getString();
String escapeCharacter = v5 == null ? null : v5.getString();
Value v6 = getNullOrValue(session, args, 6);
String nullString = v6 == null ? null : v6.getString();
Value v7 = getNullOrValue(session, args, 7);
String lineSeparator = v7 == null ? null : v7.getString();
Csv csv = Csv.getInstance();
setCsvDelimiterEscape(csv, fieldSeparatorWrite, fieldDelimiter, escapeCharacter);
csv.setNullString(nullString);
if (lineSeparator != null) {
csv.setLineSeparator(lineSeparator);
}
int rows = csv.write(conn, v0.getString(), v1.getString(), charset);
result = ValueInt.get(rows);
break;
}
case SET: {
Variable var = (Variable) args[0];
session.setVariable(var.getName(), v1);
result = v1;
break;
}
case FILE_READ: {
session.getUser().checkAdmin();
String fileName = v0.getString();
boolean blob = args.length == 1;
try {
InputStream in = new AutoCloseInputStream(FileUtils.openFileInputStream(fileName));
if (blob) {
result = ValueLob.createBlob(in, -1, database);
} else {
Reader reader;
if (v1 == ValueNull.INSTANCE) {
reader = new InputStreamReader(in);
} else {
reader = new InputStreamReader(in, v1.getString());
}
result = ValueLob.createClob(reader, -1, database);
}
} catch (IOException e) {
throw Message.convertIOException(e, fileName);
}
break;
}
default:
throw Message.getInternalError("type=" + info.type);
}
return result;
}
private Sequence getSequence(Session session, Value v0, Value v1) throws SQLException {
String schemaName, sequenceName;
if (v1 == null) {
schemaName = session.getCurrentSchemaName();
sequenceName = StringUtils.toUpperEnglish(v0.getString());
} else {
schemaName = v0.getString();
sequenceName = v1.getString();
}
return database.getSchema(schemaName).getSequence(sequenceName);
}
private int length(Value v) throws SQLException {
switch (v.getType()) {
case Value.BLOB:
case Value.CLOB:
case Value.BYTES:
case Value.JAVA_OBJECT:
return (int) v.getPrecision();
default:
return v.getString().length();
}
}
private byte[] getPaddedArrayCopy(byte[] data, int blockSize) {
int size = MathUtils.roundUp(data.length, blockSize);
byte[] newData = new byte[size];
System.arraycopy(data, 0, newData, 0, data.length);
return newData;
}
private byte[] decrypt(String algorithm, byte[] key, byte[] data) throws SQLException {
BlockCipher cipher = CipherFactory.getBlockCipher(algorithm);
byte[] newKey = getPaddedArrayCopy(key, cipher.getKeyLength());
cipher.setKey(newKey);
byte[] newData = getPaddedArrayCopy(data, BlockCipher.ALIGN);
cipher.decrypt(newData, 0, newData.length);
return newData;
}
private byte[] encrypt(String algorithm, byte[] key, byte[] data) throws SQLException {
BlockCipher cipher = CipherFactory.getBlockCipher(algorithm);
byte[] newKey = getPaddedArrayCopy(key, cipher.getKeyLength());
cipher.setKey(newKey);
byte[] newData = getPaddedArrayCopy(data, BlockCipher.ALIGN);
cipher.encrypt(newData, 0, newData.length);
return newData;
}
private byte[] getHash(String algorithm, byte[] bytes, int iterations) throws SQLException {
SHA256 hash = CipherFactory.getHash(algorithm);
for (int i = 0; i < iterations; i++) {
bytes = hash.getHash(bytes);
}
return bytes;
}
private static int getDatePart(Timestamp d, int field) {
Calendar c = Calendar.getInstance();
c.setTime(d);
int value = c.get(field);
if (field == Calendar.MONTH) {
value++;
}
return value;
}
// private static long datediffRound(String part, Date d1, Date d2)
// throws SQLException {
// // diff (yy, 31.12.2004, 1.1.2005) = 0
// Integer p = (Integer) datePart.get(StringUtils.toUpperEnglish(part));
// if (p == null) {
// throw Message.getSQLException(ErrorCode.INVALID_VALUE_2,
// new String[] { "part", part }, null);
// }
// int field = p.intValue();
// long t1 = d1.getTime(), t2 = d2.getTime();
// switch (field) {
// case Calendar.MILLISECOND:
// return t2 - t1;
// case Calendar.SECOND:
// return (t2 - t1) / 1000;
// case Calendar.MINUTE:
// return (t2 - t1) / 1000 / 60;
// case Calendar.HOUR_OF_DAY:
// return (t2 - t1) / 1000 / 60 / 60;
// case Calendar.DATE:
// return (t2 - t1) / 1000 / 60 / 60 / 24;
// }
// Calendar g1 = Calendar.getInstance();
// g1.setTimeInMillis(t1);
// int year1 = g1.get(Calendar.YEAR);
// Calendar g2 = Calendar.getInstance();
// g2.setTimeInMillis(t2);
// int year2 = g2.get(Calendar.YEAR);
// int result = year2 - year1;
// if (field == Calendar.MONTH) {
// int month1 = g1.get(Calendar.MONTH);
// int month2 = g2.get(Calendar.MONTH);
// result = 12 * result + (month2 - month1);
// g2.set(Calendar.MONTH, month1);
// }
// g2.set(Calendar.YEAR, year1);
// if (result > 0 && g1.after(g2)) {
// result--;
// } else if (result < 0 && g1.before(g2)) {
// result++;
// }
// return result;
// }
private static int getDatePart(String part) throws SQLException {
Integer p = (Integer) DATE_PART.get(StringUtils.toUpperEnglish(part));
if (p == null) {
throw Message.getSQLException(ErrorCode.INVALID_VALUE_2, new String[] { "date part", part });
}
return p.intValue();
}
private static Timestamp dateadd(String part, int count, Timestamp d) throws SQLException {
int field = getDatePart(part);
Calendar calendar = Calendar.getInstance();
int nanos = d.getNanos() % 1000000;
calendar.setTime(d);
calendar.add(field, count);
long t = calendar.getTime().getTime();
Timestamp ts = new Timestamp(t);
ts.setNanos(ts.getNanos() + nanos);
return ts;
}
private static long datediff(String part, Timestamp d1, Timestamp d2) throws SQLException {
// diff (yy, 31.12.2004, 1.1.2005) = 1
int field = getDatePart(part);
Calendar calendar = Calendar.getInstance();
long t1 = d1.getTime(), t2 = d2.getTime();
// need to convert to UTC, otherwise we get inconsistent results with
// certain timezones (those that are 30 minutes off)
TimeZone zone = calendar.getTimeZone();
calendar.setTime(d1);
t1 += zone.getOffset(calendar.get(Calendar.ERA), calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar
.get(Calendar.MILLISECOND));
calendar.setTime(d2);
t2 += zone.getOffset(calendar.get(Calendar.ERA), calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.DAY_OF_WEEK), calendar
.get(Calendar.MILLISECOND));
switch (field) {
case Calendar.MILLISECOND:
return t2 - t1;
case Calendar.SECOND:
case Calendar.MINUTE:
case Calendar.HOUR_OF_DAY: {
// first 'normalize' the numbers so both are not negative
long hour = 60 * 60 * 1000;
long add = Math.min(t1 / hour * hour, t2 / hour * hour);
t1 -= add;
t2 -= add;
switch (field) {
case Calendar.SECOND:
return t2 / 1000 - t1 / 1000;
case Calendar.MINUTE:
return t2 / (60 * 1000) - t1 / (60 * 1000);
case Calendar.HOUR_OF_DAY:
return t2 / hour - t1 / hour;
default:
throw Message.getInternalError("field:" + field);
}
}
case Calendar.DATE:
return t2 / (24 * 60 * 60 * 1000) - t1 / (24 * 60 * 60 * 1000);
default:
break;
}
calendar.setTime(new Timestamp(t1));
int year1 = calendar.get(Calendar.YEAR);
int month1 = calendar.get(Calendar.MONTH);
calendar.setTime(new Timestamp(t2));
int year2 = calendar.get(Calendar.YEAR);
int month2 = calendar.get(Calendar.MONTH);
int result = year2 - year1;
if (field == Calendar.MONTH) {
result = 12 * result + (month2 - month1);
}
return result;
}
private static String substring(String s, int start, int length) {
int len = s.length();
start--;
if (start < 0) {
start = 0;
}
if (length < 0) {
length = 0;
}
start = (start > len) ? len : start;
if (start + length > len) {
length = len - start;
}
return s.substring(start, start + length);
}
private static String trim(String s, boolean leading, boolean trailing, String sp) {
char space = (sp == null || sp.length() < 1) ? ' ' : sp.charAt(0);
// TODO function trim: HSQLDB says 'tabs are not removed', but they are.
// check what other databases do
if (leading) {
int len = s.length(), i = 0;
while (i < len && s.charAt(i) == space) {
i++;
}
s = (i == 0) ? s : s.substring(i);
}
if (trailing) {
int endIndex = s.length() - 1;
int i = endIndex;
while (i >= 0 && s.charAt(i) == space) {
i--;
}
s = i == endIndex ? s : s.substring(0, i + 1);
}
return s;
}
private static String replace(String s, String replace, String with) {
if (replace == null || replace.length() == 0) {
// avoid out of memory
return s;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -