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

📄 expression.java

📁 hsqldb是100%java实现的数据库,是一个开放源代码的JAVA数据库 l 具有标准的SQL语法和JAVA接口 l HSQLDB可以自由使用和分发 l 非常简洁和快速的
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
     * @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 + -