📄 expression.java
字号:
case NOT : return eArg.isConditional(); case AND : case OR : return eArg.isConditional() && eArg2.isConditional(); default : return false; } } /** * Collects all expressions that must be in the GROUP BY clause, for a * grouped select statement. * * @param colExps expression list */ void collectInGroupByExpressions(HsqlArrayList colExps) { if (!(isConstant() || isSelfAggregate())) { if (isColumn()) { colExps.add(this); } else if (exprType == FUNCTION) {// function.collectInGroupByExpressions(colExps); } else if (exprType == CASEWHEN) { eArg2.collectInGroupByExpressions(colExps); } else { if (eArg != null) { eArg.collectInGroupByExpressions(colExps); } if (eArg2 != null) { eArg2.collectInGroupByExpressions(colExps); } } } } /** * Set an ORDER BY column expression DESC * */ void setDescending() { isDescending = true; } /** * Is an ORDER BY column expression DESC * * * @return boolean */ boolean isDescending() { return isDescending; } /** * Set the column alias and whether the name is quoted * * @param s alias * @param isquoted boolean */ void setAlias(String s, boolean isquoted) { columnAlias = s; aliasQuoted = isquoted; } /** * Change the column name * * @param newname name * @param isquoted quoted */ void setColumnName(String newname, boolean isquoted) { columnName = newname; columnQuoted = isquoted; } /** * Change the table name * * @param newname table name for column expression */ void setTableName(String newname) { tableName = newname; } /** * Return the user defined alias or null if none * * @return alias */ String getDefinedAlias() { return columnAlias; } /** * Get the column alias * * * @return alias */ String getAlias() { if (columnAlias != null) { return columnAlias; } if (exprType == COLUMN) { return columnName; } return ""; } /** * Is a column alias quoted * * @return boolean */ boolean isAliasQuoted() { if (columnAlias != null) { return aliasQuoted; } if (exprType == COLUMN) { return columnQuoted; } return false; } /** * Returns the type of expression * * * @return type */ int getType() { return exprType; } /** * Returns the left node * * * @return argument */ Expression getArg() { return eArg; } /** * Returns the right node * * * @return argument */ Expression getArg2() { return eArg2; } /** * Returns the table filter for a COLUMN expression * * @return table filter */ TableFilter getFilter() { return tableFilter; } /** * Final check for all expressions. * * @param check boolean * @return boolean * @throws HsqlException */ boolean checkResolved(boolean check) throws HsqlException { boolean result = true; if (eArg != null) { result = result && eArg.checkResolved(check); } if (eArg2 != null) { result = result && eArg2.checkResolved(check); } if (subQuery != null && subQuery.select != null) { result = result && subQuery.select.checkResolved(check); } if (function != null) { result = result && function.checkResolved(check); } if (valueList != null) { for (int i = 0; i < valueList.length; i++) { result = result && valueList[i].checkResolved(check); } } if (exprType == COLUMN) { if (tableFilter == null) { // if an order by column alias result = joinedTableColumnIndex != -1; if (!result && check) { String err = tableName == null ? columnName : tableName + "." + columnName; throw Trace.error(Trace.COLUMN_NOT_FOUND, err); } } else { tableFilter.usedColumns[this.columnIndex] = true; } } return result; } /** * Resolve the table names for columns and throws if a column remains * unresolved. * * @param filters list of filters * * @throws HsqlException */ void checkTables(HsqlArrayList filters) throws HsqlException { if (filters == null || exprType == Expression.VALUE) { return; } if (eArg != null) { eArg.checkTables(filters); } if (eArg2 != null) { eArg2.checkTables(filters); } switch (exprType) { case COLUMN : boolean found = false; int len = filters.size(); for (int j = 0; j < len; j++) { TableFilter filter = (TableFilter) filters.get(j); String filterName = filter.getName(); if (tableName == null || filterName.equals(tableName)) { Table table = filter.getTable(); int i = table.findColumn(columnName); if (i != -1) { if (tableName == null) { if (found) { throw Trace.error( Trace.AMBIGUOUS_COLUMN_REFERENCE, columnName); } // found = true; } else { return; } } } } if (found) { return; } throw Trace.error(Trace.COLUMN_NOT_FOUND, columnName); case QUERY : // fredt - subquery in join condition ! break; case FUNCTION : if (function != null) { function.checkTables(filters); } 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].checkTables(filters); } } break; default : } } /** * return the expression for an aliases */ Expression getExpressionForAlias(Expression[] columns, int length) { for (int i = 0; i < length; i++) { if (columnName.equals(columns[i].columnAlias) && (tableName == null || tableName.equals(columns[i].tableName))) { return columns[i]; } } return this; } /** * Replace aliases with expression trees */ void replaceAliases(Expression[] columns, int length) throws HsqlException { if (eArg != null) { if (eArg.exprType == Expression.COLUMN) { eArg = eArg.getExpressionForAlias(columns, length); } else { eArg.replaceAliases(columns, length); } } if (eArg2 != null) { if (eArg2.exprType == Expression.COLUMN) { eArg2 = eArg2.getExpressionForAlias(columns, length); } else { eArg2.replaceAliases(columns, length); } } switch (exprType) { case QUERY : break; case FUNCTION : if (function != null) { function.replaceAliases(columns, length); } break; case ALL : case ANY : break; case IN : if (eArg2.exprType != QUERY) { Expression[] vl = eArg2.valueList; for (int i = 0; i < vl.length; i++) { if (vl[i].exprType == Expression.COLUMN) { vl[i] = vl[i].getExpressionForAlias(columns, length); } else { vl[i].replaceAliases(columns, length); } } } break; default : } } /** * Workaround for CHECK constraints. We don't want optimisation so we * flag all LIKE expressions as already optimised. * * @throws HsqlException */ void setLikeOptimised() throws HsqlException { if (eArg != null) { eArg.setLikeOptimised(); } if (eArg2 != null) { eArg2.setLikeOptimised(); } if (exprType == LIKE) { likeObject.optimised = true; } } /** * Removes table filter resolution from an Expression tree. *//* void removeFilters() throws HsqlException { if (eArg != null) { eArg.removeFilters(); } if (eArg2 != null) { eArg2.removeFilters(); } switch (exprType) { case COLUMN : tableFilter = null; return; case QUERY : if (subSelect != null) { subSelect.removeFilters(); } break; case FUNCTION : if (function != null) { function.removeFilters(); } break; case IN : if (eArg2.exprType != QUERY) { Expression[] vl = eArg2.valueList; for (int i = 0; i < vl.length; i++) { vl[i].removeFilters(); } } break; default : } }*/ /** * set boolean flags and expressions for columns in a join * * @param filter target table filter * @param columns boolean array
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -