📄 expression.java
字号:
* @param elist expression list */ void getEquiJoinColumns(TableFilter filter, boolean[] columns, Expression[] elist) { if (eArg != null) { eArg.getEquiJoinColumns(filter, columns, elist); } if (eArg2 != null) { eArg2.getEquiJoinColumns(filter, columns, elist); } if (exprType == EQUAL) { if (eArg.tableFilter == eArg2.tableFilter) { return; } // an elist element may be set more than once - OK if (eArg.tableFilter == filter) { if (eArg2.exprType == COLUMN || eArg2.exprType == VALUE) { columns[eArg.columnIndex] = true; elist[eArg.columnIndex] = eArg2; } return; } if (eArg2.tableFilter == filter) { if (eArg.exprType == COLUMN || eArg.exprType == VALUE) { columns[eArg2.columnIndex] = true; elist[eArg2.columnIndex] = eArg; } } } } /** * Find a table filter with the given table alias */ TableFilter findTableFilter(TableFilter[] list) { for (int t = 0; t < list.length; t++) { TableFilter f = list[t]; if (schema == null || f.filterTable.getSchemaName().equals(schema)) { if (f.getName().equals(tableName)) { return f; } } } return null; } /** * Resolve the table names for columns * * @param f table filter * * @throws HsqlException */ void resolveTables(TableFilter f) throws HsqlException { if (isParam || f == null || exprType == Expression.VALUE) { return; } if (eArg != null) { eArg.resolveTables(f); } if (eArg2 != null) { eArg2.resolveTables(f); } switch (exprType) { case COLUMN : if (tableFilter != null) { break; } String filterName = f.getName(); if (tableName == null || tableName.equals(filterName)) { Table table = f.getTable(); int i = table.findColumn(columnName); if (i != -1) { tableFilter = f; columnIndex = i; tableName = filterName; setTableColumnAttributes(table, i); // COLUMN is leaf; we are done return; } } break; case QUERY : // we now (1_7_2_ALPHA_R) resolve independently first, then // resolve in the enclosing context if (subQuery != null) { subQuery.select.resolveTablesUnion(f); } break; case FUNCTION : if (function != null) { function.resolveTables(f); } break; case ALL : case ANY : break; case IN : if (eArg2.exprType != QUERY) { Expression[] vl = eArg2.valueList; for (int i = 0; i < vl.length; i++) { vl[i].resolveTables(f); } } break; default : } } /** * For CASE WHEN and its special cases section 9.3 of the SQL standard * on type aggregation should be implemented. */ int getCaseWhenType(Session session) throws HsqlException { /* find data type in condition int type = eArg.eArg.getDataType(); then recurse on eArg2 */ return eArg2.dataType; } void resolveTypes(Session session) throws HsqlException { if (isParam) { return; } if (eArg != null) { eArg.resolveTypes(session); } if (eArg2 != null) { eArg2.resolveTypes(session); } switch (exprType) { case VALUE : if (dataType == Types.BOOLEAN && valueData != null) { dataType = 0; exprType = ((Boolean) valueData).booleanValue() ? TRUE : FALSE; } break; case COLUMN : break; case FUNCTION : function.resolveType(session); dataType = function.getReturnType(); break; case QUERY : { subQuery.select.resolveTypes(session); dataType = subQuery.select.exprColumns[0].dataType; break; } case NEGATE : if (eArg.isParam) { throw Trace.error(Trace.UNRESOLVED_PARAMETER_TYPE, Trace.Expression_resolveTypes1); } dataType = eArg.dataType; if (isFixedConstant()) { valueData = getValue(session, dataType); eArg = null; exprType = VALUE; } break; case ADD : // concat using + operator // non-standard concat operator to be deprecated if (Types.isCharacterType(eArg.dataType) || Types.isCharacterType(eArg2.dataType)) { exprType = Expression.CONCAT; dataType = Types.VARCHAR; if (isFixedConstant()) { valueData = getValue(session, dataType); eArg = null; eArg2 = null; exprType = VALUE; } else { if (eArg.isParam) { eArg.dataType = Types.VARCHAR; } if (eArg2.isParam) { eArg2.dataType = Types.VARCHAR; } } break; } case SUBTRACT : case MULTIPLY : case DIVIDE : if (eArg.isParam && eArg2.isParam) { throw Trace.error(Trace.UNRESOLVED_PARAMETER_TYPE, Trace.Expression_resolveTypes2); } if (isFixedConstant()) { dataType = Column.getCombinedNumberType(eArg.dataType, eArg2.dataType, exprType); valueData = getValue(session, dataType); eArg = null; eArg2 = null; exprType = VALUE; } else { if (eArg.isParam) { eArg.dataType = eArg2.dataType; } else if (eArg2.isParam) { eArg2.dataType = eArg.dataType; } // fredt@users 20011010 - patch 442993 by fredt dataType = Column.getCombinedNumberType(eArg.dataType, eArg2.dataType, exprType); } break; case CONCAT : dataType = Types.VARCHAR; if (isFixedConstant()) { valueData = getValue(session, dataType); eArg = null; eArg2 = null; exprType = VALUE; } else { if (eArg.isParam) { eArg.dataType = Types.VARCHAR; } if (eArg2.isParam) { eArg2.dataType = Types.VARCHAR; } } break; case EQUAL : case BIGGER_EQUAL : case BIGGER : case SMALLER : case SMALLER_EQUAL : case NOT_EQUAL : if (eArg.isParam && eArg2.isParam) { throw Trace.error(Trace.UNRESOLVED_PARAMETER_TYPE, Trace.Expression_resolveTypes3); } if (isFixedConditional()) { Boolean result = test(session); if (result == null) { setNull(); } else if (result.booleanValue()) { exprType = TRUE; } else { exprType = FALSE; } eArg = null; eArg2 = null; } else if (eArg.isParam) { eArg.dataType = eArg2.dataType == Types.NULL ? Types.VARCHAR : eArg2.dataType; if (eArg2.exprType == COLUMN) { eArg.setTableColumnAttributes(eArg2); } } else if (eArg2.isParam) { eArg2.dataType = eArg.dataType == Types.NULL ? Types.VARCHAR : eArg.dataType; if (eArg.exprType == COLUMN) { eArg2.setTableColumnAttributes(eArg); } } dataType = Types.BOOLEAN; break; case LIKE : resolveTypeForLike(session); dataType = Types.BOOLEAN; break; case AND : { boolean argFixed = eArg.isFixedConditional(); boolean arg2Fixed = eArg2.isFixedConditional(); Boolean arg = argFixed ? (eArg.test(session)) : null; Boolean arg2 = arg2Fixed ? eArg2.test(session) : null; if (argFixed && arg2Fixed) { if (arg == null || arg2 == null) { setNull(); } else { exprType = arg.booleanValue() && arg2.booleanValue() ? TRUE : FALSE; eArg = null; eArg2 = null; } } else if ((argFixed &&!Boolean.TRUE.equals(arg)) || (arg2Fixed &&!Boolean.TRUE.equals(arg2))) { exprType = FALSE; eArg = null; eArg2 = null; } else { if (eArg.isParam) { eArg.dataType = Types.BOOLEAN; } if (eArg2.isParam) { eArg2.dataType = Types.BOOLEAN; } } dataType = Types.BOOLEAN; break; } case OR : { boolean argFixed = eArg.isFixedConditional(); boolean arg2Fixed = eArg2.isFixedConditional(); Boolean arg = argFixed ? (eArg.test(session)) : null; Boolean arg2 = arg2Fixed ? eArg2.test(session) : null; if (argFixed && arg2Fixed) { if (arg == null || arg2 == null) { setNull(); } else { exprType = arg.booleanValue() || arg2.booleanValue() ? TRUE : FALSE; eArg = null; eArg2 = null; } } else if ((argFixed && Boolean.TRUE.equals(arg)) || (arg2Fixed && Boolean.TRUE.equals(arg2))) { exprType = TRUE; eArg = null; eArg2 = null; } else { if (eArg.isParam) { eArg.dataType = Types.BOOLEAN; } if (eArg2.isParam) { eArg2.dataType = Types.BOOLEAN; } } dataType = Types.BOOLEAN; break; } case IS_NULL : if (isFixedConditional()) { exprType = Boolean.TRUE.equals(test(session)) ? TRUE : FALSE; eArg = null; } else if (eArg.dataType == Types.NULL) { eArg.dataType = Types.VARCHAR; } dataType = Types.BOOLEAN; break; case NOT : if (isFixedConditional()) { Boolean arg = test(session); if (arg == null) { setNull(); } else { exprType = arg.booleanValue() ? TRUE : FALSE; eArg = null; } } else if (eArg.isParam) { eArg.dataType = Types.BOOLEAN; } dataType = Types.BOOLEAN; break; case ALL : case ANY : dataType = eArg.dataType; break; case IN : resolveTypeForIn(session); dataType = Types.BOOLEAN; break; case EXISTS : // NOTE: no such thing as a param arg if expression is EXISTS // Also, cannot detect if result is fixed value dataType = Types.BOOLEAN; break; /** @todo fredt - set the correct return type */ case COUNT : if (eArg.isParam) { throw Trace.error(Trace.UNRESOLVED_PARAMETER_TYPE, Trace.Express
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -