📄 expression.java
字号:
*/ 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; } } } } /** * 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 : } } void resolveTypes(Session session) throws HsqlException { if (isParam || exprType == Expression.VALUE) { return; } if (eArg != null) { eArg.resolveTypes(session); } if (eArg2 != null) { eArg2.resolveTypes(session); } switch (exprType) { 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.Expression_resolveTypes4); } dataType = Types.INTEGER; break; case MAX : case MIN : case SUM : case AVG : case EVERY : case SOME : case STDDEV_POP : case STDDEV_SAMP : case VAR_POP : case VAR_SAMP : if (eArg.isParam) { throw Trace.error(Trace.UNRESOLVED_PARAMETER_TYPE, Trace.Expression_resolveTypes4); } dataType = SetFunction.getType(exprType, eArg.dataType); break; case CONVERT : // NOTE: both iDataType for this expr and for eArg (if isParm) // are already set in Parser during read if (eArg.isFixedConstant() || eArg.isFixedConditional()) { valueData = getValue(session); exprType = VALUE; eArg = null; } break; case CASEWHEN : // We use CASEWHEN as parent type. // In the parent, eArg is the condition, and eArg2 is // the leaf, tagged as type ALTERNATIVE; its eArg is // case 1 (how to get the value when the condition in // the parent evaluates to true), while its eArg2 is case 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -