⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 expression.java

📁 一個Light Weighted的Java Database Engin 適合各個領域之Java數据庫編輯.
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
     */    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 + -