1 34 package smallsql.database; 35 36 37 40 final class ExpressionFunctionSubstring extends ExpressionFunctionReturnP1StringAndBinary { 41 42 43 final int getFunction() { 44 return SQLTokenizer.SUBSTRING; 45 } 46 47 48 final boolean isNull() throws Exception { 49 return param1.isNull() || param2.isNull() || param3.isNull(); 50 } 51 52 53 final byte[] getBytes() throws Exception { 54 if(isNull()) return null; 55 byte[] bytes = param1.getBytes(); 56 int byteLen = bytes.length; 57 int start = Math.min( Math.max( 0, param2.getInt() - 1), byteLen); 58 int length = param3.getInt(); 59 if(length < 0) 60 throw Utils.createSQLException("Invalid length '"+length + "' in function SUBSTRING"); 61 if(start == 0 && byteLen == length) return bytes; 62 if(byteLen > length + start){ 63 byte[] b = new byte[length]; 64 System.arraycopy(bytes, start, b, 0, length); 65 return b; 66 }else{ 67 byte[] b = new byte[byteLen - start]; 68 System.arraycopy(bytes, start, b, 0, b.length); 69 return b; 70 } 71 } 72 73 74 final String getString() throws Exception { 75 if(isNull()) return null; 76 String str = param1.getString(); 77 int strLen = str.length(); 78 int start = Math.min( Math.max( 0, param2.getInt() - 1), strLen); 79 int length = param3.getInt(); 80 if(length < 0) 81 throw Utils.createSQLException("Invalid length '"+length + "' in function SUBSTRING"); 82 length = Math.min( length, strLen-start ); 83 return str.substring(start, start+length); 84 } 85 86 87 } 88 | Popular Tags |