📄 function.java
字号:
for (; i < iArgCount; i++) { Expression e = eArg[i]; Object o = null; if (e != null) { // no argument: null o = e.getValue(session, iArgType[i]); } if ((o == null) &&!bArgNullable[i]) { // null argument for primitive datatype: don't call return null; } if (o instanceof JavaObject) { o = ((JavaObject) o).getObject(); } else if (o instanceof Binary) { o = ((Binary) o).getBytes(); } oArg[i] = o; } return oArg; } /** * returns null if any non-nullable element of values is null */ private Object[] getNotNull(Object[] values) throws HsqlException { int i = bConnection ? 1 : 0; for (; i < iArgCount; i++) { Object o = values[i]; if (o == null &&!bArgNullable[i]) { // null argument for primitive datatype: don't call return null; } } return values; } void collectInGroupByExpressions(HsqlArrayList colExps) { for (int i = 0; i < iArgCount; i++) { Expression e = eArg[i]; if (e != null) { e.collectInGroupByExpressions(colExps); } } } Object getAggregatedValue(Session session, Object currValue) throws HsqlException { Object[] valueArray = (Object[]) currValue; if (valueArray == null) { valueArray = new Object[iArgCount]; } for (int i = 0; i < iArgCount; i++) { Expression e = eArg[i]; if (eArg[i] != null) { if (eArg[i].isAggregate()) { valueArray[i] = Column.convertObject( e.getAggregatedValue(session, valueArray[i]), iArgType[i]); } else { valueArray[i] = e.getValue(session, iArgType[i]); } } } valueArray = getNotNull(valueArray); if (valueArray == null) { return null; } return getValue(session, valueArray); } Object updateAggregatingValue(Session session, Object currValue) throws HsqlException { Object[] valueArray = (Object[]) currValue; if (valueArray == null) { valueArray = new Object[iArgCount]; } for (int i = 0; i < iArgCount; i++) { Expression e = eArg[i]; if (eArg[i] != null) { valueArray[i] = e.updateAggregatingValue(session, valueArray[i]); } } return valueArray; } /** * Returns the number of parameters that must be supplied to evaluate * this Function object from SQL. <p> * * This value may be different than the number of parameters of the * underlying Java method. This is because HSQLDB automatically detects * if the first parameter is of type java.sql.Connection, and supplies a * live Connection object constructed from the evaluating session context * if so. */ int getArgCount() { return iSqlArgCount; } /** * Remnoves the Table filters from Expression parameters to this Function. * * @throws HsqlException if there is a problem resolving a parameter * against the specified TableFilter *//* void removeFilters() throws HsqlException { Expression e; for (int i = iSqlArgStart; i < iArgCount; i++) { e = eArg[i]; if (e != null) { e.removeFilters(); } } }*/ void replaceAliases(Expression[] columns, int length) throws HsqlException { Expression e; for (int i = iSqlArgStart; i < iArgCount; i++) { e = eArg[i]; if (e != null) { if (e.exprType == Expression.COLUMN) { eArg[i] = e.getExpressionForAlias(columns, length); } else { e.replaceAliases(columns, length); } } } } /** * Checks the Expresion parameters to this Function object against the * set of TableFilter. */ void checkTables(HsqlArrayList fa) throws HsqlException { Expression e; for (int i = iSqlArgStart; i < iArgCount; i++) { e = eArg[i]; if (e != null) { e.checkTables(fa); } } } /** * Resolves the Expression parameters to this Function object against the * specified TableFilter. */ void resolveTables(TableFilter f) throws HsqlException { Expression e; for (int i = iSqlArgStart; i < iArgCount; i++) { e = eArg[i]; if (e != null) { e.resolveTables(f); } } } /** * Resolves the type of this expression and performs certain * transformations and optimisations of the expression tree. */ void resolveType(Session session) throws HsqlException { Expression e; for (int i = iSqlArgStart; i < iArgCount; i++) { e = eArg[i]; if (e != null) { if (e.isParam()) { e.setDataType(iArgType[i]); e.nullability = getArgNullability(i); e.valueClassName = getArgClass(i).getName(); } else { e.resolveTypes(session); } } } } /** * Checks each of this object's arguments for resolution, throwing an * HsqlException if any arguments have not yet been resolved. <p> * The check boolean argument is passed on to further check calls.<p> */ boolean checkResolved(boolean check) throws HsqlException { boolean result = true; for (int i = iSqlArgStart; i < iArgCount; i++) { if (eArg[i] != null) { result = result && eArg[i].checkResolved(check); } } return result; } /** * Returns the type of the argument at the specified * offset in this Function object's paramter list. <p> */ int getArgType(int i) { return iArgType[i]; } /** * Returns the type of this Function * object's return type. <p> */ int getReturnType() { return iReturnType; } /** * Binds the specified expression to the specified position in this * Function object's parameter list. <p> */ void setArgument(int i, Expression e) { if (bConnection) { i++; } eArg[i] = e; hasAggregate = hasAggregate || (e != null && e.isAggregate()); } /** * Returns a DDL representation of this object. <p> */ String getDLL() throws HsqlException { StringBuffer sb = new StringBuffer(); // get the name as used by the CHECK statement String ddlName = name; if (isSimple) { return name; } else if (Token.T_TRIM.equals(name)) { // special case for TRIM sb.append(name).append('('); boolean leading = eArg[2].testCondition(null); boolean trailing = eArg[3].testCondition(null); if (leading && trailing) { sb.append(Token.T_BOTH); } else { sb.append(leading ? Token.T_LEADING : Token.T_TRAILING); } // to do change to string sb.append(' '); String charval = (String) eArg[1].getValue(null); sb.append(Column.createSQLString(charval)).append(' '); sb.append(Token.T_FROM).append(' '); sb.append(eArg[0].getDDL()).append(')'); return sb.toString(); } if (sFunction.equals(name)) { ddlName = StringConverter.toQuotedString(name, '"', true); } sb.append(ddlName).append('('); for (int i = iSqlArgStart; i < eArg.length; i++) { sb.append(eArg[i].getDDL()); if (i < eArg.length - 1) { sb.append(','); } } sb.append(')'); return sb.toString(); } /** * Returns a String representation of this object. <p> */ public String describe(Session session) { StringBuffer sb = new StringBuffer(); sb.append(super.toString()).append("=[\n"); sb.append(sFunction).append("("); for (int i = iSqlArgStart; i < eArg.length; i++) { sb.append("[").append(eArg[i].describe(session)).append("]"); } sb.append(") returns ").append(Types.getTypeString(getReturnType())); sb.append("]\n"); return sb.toString(); } /** * Returns the Java Class of the object returned by getValue(). <p> */ String getReturnClassName() { return returnClassName; } /** * Returns the Java Class of the i'th argument. <p> */ Class getArgClass(int i) { return aArgClasses[i]; } /** * Returns the SQL nullability code of the i'th argument. <p> */ int getArgNullability(int i) { return bArgNullable[i] ? Expression.NULLABLE : Expression.NO_NULLS; } Method getMethod() { return mMethod; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -