📄 expression.java
字号:
* @param datatype data type * @param o data */ Expression(int datatype, Object o) { exprType = VALUE; dataType = datatype; valueData = o; } /** * Creates a new (possibly PARAM) VALUE expression * * @param datatype initial datatype * @param o initial value * @param isParam true if this is to be a PARAM VALUE expression */ Expression(int datatype, Object o, boolean isParam) { this(datatype, o); this.isParam = isParam; if (isParam) { paramMode = PARAM_IN; } } private void checkAggregate() { if (isAggregate(exprType)) { aggregateSpec = AGGREGATE_SELF; } else { aggregateSpec = AGGREGATE_NONE; if ((eArg != null) && eArg.isAggregate()) { aggregateSpec += AGGREGATE_LEFT; } if ((eArg2 != null) && eArg2.isAggregate()) { aggregateSpec += AGGREGATE_RIGHT; } } } public String describe(Session session) { return describe(session, 0); } static String getContextDDL(Expression expression) throws HsqlException { String ddl = expression.getDDL(); if (expression.exprType != VALUE && expression.exprType != COLUMN && expression.exprType != FUNCTION && expression.exprType != ALTERNATIVE && expression.exprType != CASEWHEN && expression.exprType != CONVERT) { StringBuffer temp = new StringBuffer(); ddl = temp.append('(').append(ddl).append(')').toString(); } return ddl; } /** * For use with CHECK constraints. Under development. * * Currently supports a subset of expressions and is suitable for CHECK * search conditions that refer only to the inserted/updated row. * * For full DDL reporting of VIEW select queries and CHECK search * conditions, future improvements here are dependent upon improvements to * SELECT query parsing, so that it is performed in a number of passes. * An early pass should result in the query turned into an Expression tree * that contains the information in the original SQL without any * alterations, and with tables and columns all resolved. This Expression * can then be preserved for future use. Table and column names that * are not user-defined aliases should be kept as the HsqlName structures * so that table or column renaming is reflected in the precompiled * query. * * @return DDL * @throws HsqlException */ String getDDL() throws HsqlException { StringBuffer buf = new StringBuffer(64); String left = null; String right = null; if (eArg != null) { left = Expression.getContextDDL(eArg); } if (eArg2 != null) { right = Expression.getContextDDL(eArg2); } switch (exprType) { case FUNCTION : return function.getDLL(); case VALUE : try { return Column.createSQLString(valueData, dataType); } catch (HsqlException e) {} return buf.toString(); case COLUMN : // this is a limited solution Table table = tableFilter.getTable(); if (tableName != null) { buf.append(table.tableName.statementName); buf.append('.'); } buf.append( table.getColumn(columnIndex).columnName.statementName); return buf.toString(); case TRUE : return Token.T_TRUE; case FALSE : return Token.T_FALSE; case VALUELIST : for (int i = 0; i < valueList.length; i++) { buf.append(valueList[i].getDDL()); if (i < valueList.length - 1) { buf.append(','); } } return buf.toString(); case ASTERIX : buf.append('*'); return buf.toString(); case NEGATE : buf.append('-').append(left); return buf.toString(); case ADD : buf.append(left).append('+').append(right); return buf.toString(); case SUBTRACT : buf.append(left).append('-').append(right); return buf.toString(); case MULTIPLY : buf.append(left).append('*').append(right); return buf.toString(); case DIVIDE : buf.append(left).append('/').append(right); return buf.toString(); case CONCAT : buf.append(left).append("||").append(right); return buf.toString(); case NOT : if (eArg.exprType == IS_NULL) { buf.append(getContextDDL(eArg.eArg)).append(' ').append( Token.T_IS).append(' ').append(Token.T_NOT).append( ' ').append(Token.T_NULL); return buf.toString(); } buf.append(Token.T_NOT).append(' ').append(left); return buf.toString(); case EQUAL : buf.append(left).append('=').append(right); return buf.toString(); case BIGGER_EQUAL : buf.append(left).append(">=").append(right); return buf.toString(); case BIGGER : buf.append(left).append('>').append(right); return buf.toString(); case SMALLER : buf.append(left).append('<').append(right); return buf.toString(); case SMALLER_EQUAL : buf.append(left).append("<=").append(right); return buf.toString(); case NOT_EQUAL : if (Token.T_NULL.equals(right)) { buf.append(left).append(" IS NOT ").append(right); } else { buf.append(left).append("!=").append(right); } return buf.toString(); case LIKE : buf.append(left).append(' ').append(Token.T_LIKE).append(' '); buf.append(right); /** @todo fredt - scripting of non-ascii escapes needs changes to general script logging */ if (likeObject.escapeChar != null) { buf.append(' ').append(Token.T_ESCAPE).append(' ').append( '\''); buf.append(likeObject.escapeChar.toString()).append('\''); buf.append(' '); } return buf.toString(); case AND : buf.append(left).append(' ').append(Token.T_AND).append( ' ').append(right); return buf.toString(); case OR : buf.append(left).append(' ').append(Token.T_OR).append( ' ').append(right); return buf.toString(); case ALL : buf.append(left).append(' ').append(Token.T_ALL).append( ' ').append(right); return buf.toString(); case ANY : buf.append(left).append(' ').append(Token.T_ANY).append( ' ').append(right); return buf.toString(); case IN : buf.append(left).append(' ').append(Token.T_IN).append( ' ').append(right); return buf.toString(); case CONVERT : buf.append(' ').append(Token.T_CONVERT).append('('); buf.append(left).append(','); buf.append(Types.getTypeString(dataType, precision, scale)); buf.append(')'); return buf.toString(); case CASEWHEN : buf.append(' ').append(Token.T_CASEWHEN).append('('); buf.append(left).append(',').append(right).append(')'); return buf.toString(); case IS_NULL : buf.append(left).append(' ').append(Token.T_IS).append( ' ').append(Token.T_NULL); return buf.toString(); case ALTERNATIVE : buf.append(left).append(',').append(right); return buf.toString(); case QUERY :/* buf.append('('); buf.append(subSelect.getDDL()); buf.append(')');*/ break; case EXISTS : buf.append(' ').append(Token.T_EXISTS).append(' '); break; case COUNT : buf.append(' ').append(Token.T_COUNT).append('('); break; case SUM : buf.append(' ').append(Token.T_SUM).append('('); buf.append(left).append(')'); break; case MIN : buf.append(' ').append(Token.T_MIN).append('('); buf.append(left).append(')'); break; case MAX : buf.append(' ').append(Token.T_MAX).append('('); buf.append(left).append(')'); break; case AVG : buf.append(' ').append(Token.T_AVG).append('('); buf.append(left).append(')'); break; case EVERY : buf.append(' ').append(Token.T_EVERY).append('('); buf.append(left).append(')'); break; case SOME : buf.append(' ').append(Token.T_SOME).append('('); buf.append(left).append(')'); break; case STDDEV_POP : buf.append(' ').append(Token.T_STDDEV_POP).append('('); buf.append(left).append(')'); break; case STDDEV_SAMP : buf.append(' ').append(Token.T_STDDEV_SAMP).append('('); buf.append(left).append(')'); break; case VAR_POP : buf.append(' ').append(Token.T_VAR_POP).append('('); buf.append(left).append(')'); break; case VAR_SAMP : buf.append(' ').append(Token.T_VAR_SAMP).append('('); buf.append(left).append(')'); break; } throw Trace.error(Trace.EXPRESSION_NOT_SUPPORTED); } private String describe(Session session, int blanks) { int lIType; StringBuffer buf = new StringBuffer(64); buf.append('\n'); for (int i = 0; i < blanks; i++) { buf.append(' '); } if (oldIType != -1) { buf.append("SET TRUE, WAS: "); } lIType = oldIType == -1 ? exprType : oldIType; switch (lIType) { case FUNCTION : buf.append("FUNCTION "); buf.append(function.describe(session)); return buf.toString(); case VALUE : if (isParam) { buf.append("PARAM "); } buf.append("VALUE = ").append(valueData); buf.append(", TYPE = ").append(Types.getTypeString(dataType)); return buf.toString(); case COLUMN : buf.append("COLUMN "); if (tableName != null) { buf.append(tableName); buf.append('.'); } buf.append(columnName); return buf.toString(); case QUERY : buf.append("QUERY "); buf.append(subQuery.select.describe(session)); return buf.toString(); case TRUE : buf.append("TRUE "); break; case FALSE : buf.append("FALSE "); break; case VALUELIST : buf.append("VALUELIST "); buf.append(" TYPE = ").append(Types.getTypeString(dataType)); if (valueList != null) { for (int i = 0; i < valueList.length; i++) { buf.append(valueList[i].describe(session, blanks + blanks)); buf.append(' '); } } break; case ASTERIX : buf.append("* "); break; case NEGATE : buf.append("NEGATE "); break; case ADD : buf.append("ADD "); break; case SUBTRACT : buf.append("SUBTRACT "); break; case MULTIPLY : buf.append("MULTIPLY "); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -