?? function.java
字號:
StringBuffer buff = new StringBuffer(s.length());
int start = 0;
int len = replace.length();
while (true) {
int i = s.indexOf(replace, start);
if (i == -1) {
break;
}
buff.append(s.substring(start, i));
buff.append(with);
start = i + len;
}
buff.append(s.substring(start));
return buff.toString();
}
private static String repeat(String s, int count) {
StringBuffer buff = new StringBuffer(s.length() * count);
while (count-- > 0) {
buff.append(s);
}
return buff.toString();
}
private static String rawToHex(String s) {
StringBuffer buff = new StringBuffer(4 * s.length());
for (int i = 0; i < s.length(); i++) {
String hex = Integer.toHexString(s.charAt(i) & 0xffff);
for (int j = hex.length(); j < 4; j++) {
buff.append('0');
}
buff.append(hex);
}
return buff.toString();
}
private static int locate(String search, String s, int start) {
if (start < 0) {
int i = s.length() + start;
return s.lastIndexOf(search, i) + 1;
} else {
int i = (start == 0) ? 0 : start - 1;
return s.indexOf(search, i) + 1;
}
}
private static String right(String s, int count) {
if (count < 0) {
count = 0;
} else if (count > s.length()) {
count = s.length();
}
return s.substring(s.length() - count);
}
private static String left(String s, int count) {
if (count < 0) {
count = 0;
} else if (count > s.length()) {
count = s.length();
}
return s.substring(0, count);
}
private static String insert(String s1, int start, int length, String s2) {
if (s1 == null) {
return s2;
}
if (s2 == null) {
return s1;
}
int len1 = s1.length();
int len2 = s2.length();
start--;
if (start < 0 || length <= 0 || len2 == 0 || start > len1) {
return s1;
}
if (start + length > len1) {
length = len1 - start;
}
return s1.substring(0, start) + s2 + s1.substring(start + length);
}
private static String hexToRaw(String s) throws SQLException {
// TODO function hextoraw compatibility with oracle
int len = s.length();
if (len % 4 != 0) {
throw Message.getSQLException(ErrorCode.DATA_CONVERSION_ERROR_1, s);
}
StringBuffer buff = new StringBuffer(len / 4);
for (int i = 0; i < len; i += 4) {
try {
char raw = (char) Integer.parseInt(s.substring(i, i + 4), 16);
buff.append(raw);
} catch (NumberFormatException e) {
throw Message.getSQLException(ErrorCode.DATA_CONVERSION_ERROR_1, s);
}
}
return buff.toString();
}
private static int getDifference(String s1, String s2) {
// TODO function difference: compatibility with SQL Server and HSQLDB
s1 = getSoundex(s1);
s2 = getSoundex(s2);
int e = 0;
for (int i = 0; i < 4; i++) {
if (s1.charAt(i) == s2.charAt(i)) {
e++;
}
}
return e;
}
private double roundmagic(double d) {
if ((d < 0.0000000000001) && (d > -0.0000000000001)) {
return 0.0;
}
if ((d > 1000000000000.) || (d < -1000000000000.)) {
return d;
}
StringBuffer s = new StringBuffer();
s.append(d);
if (s.toString().indexOf("E") >= 0) {
return d;
}
int len = s.length();
if (len < 16) {
return d;
}
if (s.toString().indexOf(".") > len - 3) {
return d;
}
s.delete(len - 2, len);
len -= 2;
char c1 = s.charAt(len - 2);
char c2 = s.charAt(len - 3);
char c3 = s.charAt(len - 4);
if ((c1 == '0') && (c2 == '0') && (c3 == '0')) {
s.setCharAt(len - 1, '0');
} else if ((c1 == '9') && (c2 == '9') && (c3 == '9')) {
s.setCharAt(len - 1, '9');
s.append('9');
s.append('9');
s.append('9');
}
return Double.valueOf(s.toString()).doubleValue();
}
private static String getSoundex(String s) {
int len = s.length();
char[] chars = new char[] { '0', '0', '0', '0' };
char lastDigit = '0';
for (int i = 0, j = 0; i < len && j < 4; i++) {
char c = s.charAt(i);
char newDigit = c > SOUNDEX_INDEX.length ? 0 : SOUNDEX_INDEX[c];
if (newDigit != 0) {
if (j == 0) {
chars[j++] = c;
lastDigit = newDigit;
} else if (newDigit <= '6') {
if (newDigit != lastDigit) {
chars[j++] = newDigit;
lastDigit = newDigit;
}
} else if (newDigit == '7') {
lastDigit = newDigit;
}
}
}
return new String(chars);
}
public int getType() {
return dataType;
}
public void mapColumns(ColumnResolver resolver, int level) throws SQLException {
for (int i = 0; i < args.length; i++) {
args[i].mapColumns(resolver, level);
}
}
protected void checkParameterCount(int len) throws SQLException {
int min = 0, max = Integer.MAX_VALUE;
switch (info.type) {
case COALESCE:
case CSVREAD:
case LEAST:
case GREATEST:
min = 1;
break;
case NOW:
case CURRENT_TIMESTAMP:
case RAND:
max = 1;
break;
case COMPRESS:
case LTRIM:
case RTRIM:
case TRIM:
case FILE_READ:
min = 1;
max = 2;
break;
case REPLACE:
case LOCATE:
case INSTR:
case SUBSTR:
case SUBSTRING:
case LPAD:
case RPAD:
min = 2;
max = 3;
break;
case CASE:
case CONCAT:
case CSVWRITE:
min = 2;
break;
case XMLNODE:
min = 1;
max = 3;
break;
case FORMATDATETIME:
case PARSEDATETIME:
min = 2;
max = 4;
break;
case CURRVAL:
case NEXTVAL:
min = 1;
max = 2;
break;
default:
throw Message.getInternalError("type=" + info.type);
}
boolean ok = (len >= min) && (len <= max);
if (!ok) {
throw Message.getSQLException(ErrorCode.INVALID_PARAMETER_COUNT_2, new String[] { info.name,
min + ".." + max });
}
}
public void doneWithParameters() throws SQLException {
if (info.parameterCount == VAR_ARGS) {
int len = varArgs.size();
checkParameterCount(len);
args = new Expression[len];
varArgs.toArray(args);
varArgs = null;
} else {
int len = args.length;
if (len > 0 && args[len - 1] == null) {
throw Message
.getSQLException(ErrorCode.INVALID_PARAMETER_COUNT_2, new String[] { info.name, "" + len });
}
}
}
/**
* Set the result data type of this function.
*
* @param dataType the data type
* @param precision the precision
* @param scale the scale
* @param displaySize the display size
*/
public void setDataType(int dataType, long precision, int scale, int displaySize) {
this.dataType = dataType;
this.precision = precision;
this.displaySize = displaySize;
this.scale = scale;
}
public void setDataType(Column col) {
dataType = col.getType();
precision = col.getPrecision();
displaySize = col.getDisplaySize();
scale = col.getScale();
}
public Expression optimize(Session session) throws SQLException {
boolean allConst = info.isDeterministic;
for (int i = 0; i < args.length; i++) {
Expression e = args[i].optimize(session);
args[i] = e;
if (!e.isConstant()) {
allConst = false;
}
}
Expression p0 = args.length < 1 ? null : args[0];
switch (info.type) {
case IFNULL:
case NULLIF:
case COALESCE:
case LEAST:
case GREATEST: {
dataType = Value.UNKNOWN;
scale = 0;
precision = 0;
displaySize = 0;
for (int i = 0; i < args.length; i++) {
Expression e = args[i];
if (e != ValueExpression.NULL && e.getType() != Value.UNKNOWN) {
dataType = Value.getHigherOrder(dataType, e.getType());
scale = Math.max(scale, e.getScale());
precision = Math.max(precision, e.getPrecision());
displaySize = Math.max(displaySize, e.getDisplaySize());
}
}
if (dataType == Value.UNKNOWN) {
dataType = Value.STRING;
scale = 0;
precision = Integer.MAX_VALUE;
displaySize = Integer.MAX_VALUE;
}
break;
}
case CASEWHEN:
dataType = Value.getHigherOrder(args[1].ge
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -