Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
   package org.hsqldb;
   
   
   public class Expression
   {
    static final int VALUE = 1;
    static final int COLUMN = 2;
    static final int QUERY = 3;
    static final int TRUE = 4;
    static final int FALSE = -4;
    static final int VALUELIST = 5;
    static final int ASTERISK = 6;
    static final int FUNCTION = 7;
    static final int LIMIT = 8;
    static final int ROW = 9;
    static final int PARAM = 9;
    static final int NEGATE = 10;
    static final int ADD = 11;
    static final int SUBTRACT = 12;
    static final int MULTIPLY = 13;
    static final int DIVIDE = 14;
    static final int CONCAT = 15;
    static final int NOT = 20;
    static final int EQUAL = 21;
    static final int BIGGER_EQUAL = 22;
    static final int BIGGER = 23;
    static final int SMALLER = 24;
    static final int SMALLER_EQUAL = 25;
    static final int NOT_EQUAL = 26;
    static final int LIKE = 27;
    static final int AND = 28;
    static final int OR = 29;
    static final int IN = 30;
    static final int EXISTS = 31;
    static final int ALL = 32;
    static final int ANY = 33;
    static final int IS_NULL = 34;
    static final int COUNT = 40;
    static final int SUM = 41;
    static final int MIN = 42;
    static final int MAX = 43;
    static final int AVG = 44;
    static final int EVERY = 45;
    static final int SOME = 46;
    static final int STDDEV_POP = 47;
    static final int STDDEV_SAMP = 48;
    static final int VAR_POP = 49;
    static final int VAR_SAMP = 50;
    static final int IFNULL = 60;
    static final int CONVERT = 61;
    static final int CASEWHEN = 62;
    static final int EXTRACT = 63;
    static final int POSITION = 64;
    static final int TRIM = 65;
    static final int SUBSTRING = 66;
    static final int NULLIF = 67;
    static final int CASE = 68;
    static final int COALESCE = 69;
    static final int ALTERNATIVE = 70;
    static final int SEQUENCE = 71;
    static final int PLUS = 100;
    static final int OPEN = 101;
    static final int CLOSE = 102;
    static final int SELECT = 103;
    static final int COMMA = 104;
    static final int BETWEEN = 106;
    static final int CAST = 107;
    static final int END = 108;
    static final int IS = 109;
    static final int WHEN = 110;
    static final int THEN = 111;
    static final int ELSE = 112;
    static final int ENDWHEN = 113;
    static final int DISTINCT = 114;
    static final int VIEW = 115;
    static final int AS = 122;
    static final int FOR = 123;
    static final int FROM = 124;
    static final int BOTH = 125;
    static final int LEADING = 126;
    static final int TRAILING = 127;
    static final int YEAR = 128;
    static final int MONTH = 129;
    static final int DAY = 130;
    static final int HOUR = 131;
    static final int MINUTE = 132;
    static final int SECOND = 133;
    static final int TIMEZONE_HOUR = 134;
    static final int T_TIMEZONE_MINUTE = 135;
    static final int DOW = 136;
    static final HashSet SQL_EXTRACT_FIELD_NAMES = new HashSet();
    static final HashSet SQL_TRIM_SPECIFICATION = new HashSet();
    private static final int AGGREGATE_SELF = -1;
    private static final int AGGREGATE_NONE = 0;
    private static final int AGGREGATE_LEFT = 1;
   private static final int AGGREGATE_RIGHT = 2;
   private static final int AGGREGATE_BOTH = 3;
   private static final int AGGREGATE_FUNCTION = 4;
   int exprType;
   private int aggregateSpec = 0;
   private int dataType;
   private boolean isFixedConstantValueList;
   boolean isQueryCorrelated;
   private Like likeObject;
   private String catalog;
   private String schema;
   private String tableName;
   private String columnName;
   private TableFilter tableFilter;
   private int columnIndex;
   private boolean columnQuoted;
   private int precision;
   private int scale;
   private String columnAlias;
   private boolean aliasQuoted;
   private boolean isDescending;
   int joinedTableColumnIndex = -1;
   boolean isDistinctAggregate;
   private boolean isParam;
   boolean isInJoin;
   static final Integer INTEGER_0;
   static final Integer INTEGER_1;
   int oldIType = -1;
   static final int PARAM_UNKNOWN = 0;
   public static final int PARAM_IN = 1;
   public static final int PARAM_IN_OUT = 2;
   public static final int PARAM_OUT = 4;
   static final int NO_NULLS = 0;
   static final int NULLABLE = 1;
   static final int NULLABLE_UNKNOWN = 2;
   boolean isIdentity;
   int nullability = 2;
   boolean isWritable;
   int paramMode = 0;
 
   Expression(boolean paramBoolean)
   {
     this.exprType = (paramBoolean ? 4 : -4);
   }
 
   Expression(Function paramFunction)
   {
     this.exprType = 7;
     this.function = paramFunction;
     if (paramFunction.hasAggregate)
       this.aggregateSpec = 4;
   }
 
   Expression(NumberSequence paramNumberSequence)
   {
     this.exprType = 71;
     this.valueData = paramNumberSequence;
     this.dataType = paramNumberSequence.getType();
   }
 
   Expression(Expression paramExpression)
   {
     this.exprType = paramExpression.exprType;
     this.dataType = paramExpression.dataType;
     this.eArg = paramExpression.eArg;
     this.eArg2 = paramExpression.eArg2;
     this.isInJoin = paramExpression.isInJoin;
     this.likeObject = paramExpression.likeObject;
     this.subQuery = paramExpression.subQuery;
     this.function = paramExpression.function;
     checkAggregate();
   }
 
   Expression(SubQuery paramSubQuery)
   {
     this.exprType = 3;
     this.subQuery = paramSubQuery;
   }
 
   Expression(Expression[] paramArrayOfExpression)
   {
     this.exprType = 5;
     this.valueList = paramArrayOfExpression;
   }
 
   Expression(int paramIntExpression paramExpression1Expression paramExpression2)
   {
     this.exprType = paramInt;
     this.eArg = paramExpression1;
     this.eArg2 = paramExpression2;
     checkAggregate();
   }
 
   Expression(Expression paramExpressionint paramInt1int paramInt2int paramInt3)
   {
     this.exprType = 61;
     this.eArg = paramExpression;
     this.dataType = paramInt1;
     this.precision = paramInt2;
     this.scale = paramInt3;
     this.columnAlias = paramExpression.columnAlias;
     this.aliasQuoted = paramExpression.aliasQuoted;
     checkAggregate();
   }
 
   Expression(Expression paramExpression1Expression paramExpression2Character paramCharacterboolean paramBoolean)
   {
     this.exprType = 27;
     this.eArg = paramExpression1;
     this.eArg2 = paramExpression2;
     this.likeObject = new Like(paramCharacter, paramBoolean);
     checkAggregate();
   }
 
   Expression(String paramString1String paramString2String paramString3)
   {
     this.schema = paramString1;
     this.tableName = paramString2;
     if (paramString3 == null)
     {
       this.exprType = 6;
     }
     else
     {
       this.exprType = 2;
       this.columnName = paramString3;
     }
   }
 
   Expression(String paramString1String paramString2boolean paramBoolean)
   {
     this.tableName = paramString1;
     if (paramString2 == null)
     {
       this.exprType = 6;
     }
     else
     {
       this.exprType = 2;
       this.columnName = paramString2;
       this.columnQuoted = paramBoolean;
     }
   }
 
   Expression(TableFilter paramTableFilterColumn paramColumn)
   {
     this.schema = paramTableFilter.filterTable.tableName.schema.name;
     this.tableName = paramTableFilter.getName();
     if (paramColumn == null)
     {
       this.exprType = 6;
     }
     else
     {
       this.exprType = 2;
       this.columnName = paramColumn.columnName.name;
       this.columnQuoted = paramColumn.columnName.isNameQuoted;
       this.dataType = paramColumn.getType();
     }
   }
 
   Expression(int paramIntObject paramObject)
   {
     this.exprType = 1;
     this.dataType = paramInt;
     this.valueData = paramObject;
   }
 
   Expression(int paramIntObject paramObjectboolean paramBoolean)
   {
     this(paramInt, paramObject);
     this.isParam = paramBoolean;
     if (paramBoolean)
       this.paramMode = 1;
   }
 
   boolean isTypeEqual(Expression paramExpression)
   {
     return (this.dataType == paramExpression.dataType) && (this.precision == paramExpression.precision) && (this.scale == paramExpression.scale);
   }
 
   private void checkAggregate()
   {
     if (isAggregate(this.exprType))
     {
       this.aggregateSpec = -1;
     }
     else
     {
       this.aggregateSpec = 0;
       if ((this.eArg != null) && (this.eArg.isAggregate()))
         this.aggregateSpec += 1;
       if ((this.eArg2 != null) && (this.eArg2.isAggregate()))
         this.aggregateSpec += 2;
     }
   }
 
   public String describe(Session paramSession)
   {
     return describe(paramSession, 0);
   }
 
   static String getContextDDL(Expression paramExpression)
     throws HsqlException
   {
     String str = paramExpression.getDDL();
     if ((paramExpression.exprType != 1) && (paramExpression.exprType != 2) && (paramExpression.exprType != 7) && (paramExpression.exprType != 70) && (paramExpression.exprType != 62) && (paramExpression.exprType != 61))
     {
       StringBuffer localStringBuffer = new StringBuffer();
       str = '(' + str + ')';
     }
     return str;
   }
 
     throws HsqlException
   {
     Trace.doAssert(this.exprType == 2);
     StringBuffer localStringBuffer = new StringBuffer();
     Table localTable = this.tableFilter.getTable();
     if (this.tableName != null)
     {
       if (!this.tableName.equals("SYSTEM_SUBQUERY"))
         localStringBuffer.append('"').append(this.tableName).append('"').append('.');
     }
     else
       localStringBuffer.append(localTable.tableName.statementName).append('.');
     localStringBuffer.append(localTable.getColumn(this.columnIndex).columnName.statementName);
     return localStringBuffer.toString();
   }
 
   String getDDL()
     throws HsqlException
   {
     StringBuffer localStringBuffer = new StringBuffer(64);
     String str1 = null;
     String str2 = null;
     if (this.eArg != null)
       str1 = getContextDDL(this.eArg);
     if (this.eArg2 != null)
       str2 = getContextDDL(this.eArg2);
     switch (this.exprType)
     {
     case 7:
       return this.function.getDLL();
     case 1:
       try
       {
         return this.isParam ? "?" : Column.createSQLString(this.valueData, this.dataType);
       }
       catch (HsqlException localHsqlException)
       {
         return localStringBuffer.toString();
       }
     case 2:
       Table localTable = this.tableFilter.getTable();
       if (this.tableName != null)
       {
         localStringBuffer.append(localTable.tableName.statementName);
         localStringBuffer.append('.');
       }
       localStringBuffer.append(localTable.getColumn(this.columnIndex).columnName.statementName);
       return localStringBuffer.toString();
     case 4:
       return "TRUE";
     case -4:
       return "FALSE";
     case 5:
       for (int i = 0; i < this.valueList.length; i++)
       {
         localStringBuffer.append(this.valueList[i].getDDL());
         if (i >= this.valueList.length - 1)
           continue;
         localStringBuffer.append(',');
       }
       return localStringBuffer.toString();
     case 6:
       localStringBuffer.append('*');
       return localStringBuffer.toString();
     case 10:
       localStringBuffer.append('-').append(str1);
       return localStringBuffer.toString();
     case 11:
       localStringBuffer.append(str1).append('+').append(str2);
       return localStringBuffer.toString();
     case 12:
       localStringBuffer.append(str1).append('-').append(str2);
       return localStringBuffer.toString();
     case 13:
       localStringBuffer.append(str1).append('*').append(str2);
       return localStringBuffer.toString();
     case 14:
       localStringBuffer.append(str1).append('/').append(str2);
       return localStringBuffer.toString();
     case 15:
       localStringBuffer.append(str1).append("||").append(str2);
       return localStringBuffer.toString();
     case 20:
       if (this.eArg.exprType == 34)
       {
         localStringBuffer.append(getContextDDL(this.eArg.eArg)).append(' ').append("IS").append(' ').append("NOT").append(' ').append("NULL");
         return localStringBuffer.toString();
       }
       localStringBuffer.append("NOT").append(' ').append(str1);
       return localStringBuffer.toString();
     case 21:
       localStringBuffer.append(str1).append('=').append(str2);
       return localStringBuffer.toString();
     case 22:
       localStringBuffer.append(str1).append(">=").append(str2);
       return localStringBuffer.toString();
     case 23:
       localStringBuffer.append(str1).append('>').append(str2);
       return localStringBuffer.toString();
     case 24:
       localStringBuffer.append(str1).append('<').append(str2);
       return localStringBuffer.toString();
     case 25:
       localStringBuffer.append(str1).append("<=").append(str2);
       return localStringBuffer.toString();
     case 26:
       if ("NULL".equals(str2))
         localStringBuffer.append(str1).append(" IS NOT ").append(str2);
       else
         localStringBuffer.append(str1).append("!=").append(str2);
       return localStringBuffer.toString();
     case 27:
       localStringBuffer.append(str1).append(' ').append("LIKE").append(' ');
       localStringBuffer.append(str2);
       if (this.likeObject.escapeChar != null)
       {
         localStringBuffer.append(' ').append("ESCAPE").append(' ').append('\'');
         localStringBuffer.append(this.likeObject.escapeChar.toString()).append('\'');
         localStringBuffer.append(' ');
       }
       return localStringBuffer.toString();
     case 28:
       localStringBuffer.append(str1).append(' ').append("AND").append(' ').append(str2);
       return localStringBuffer.toString();
     case 29:
       localStringBuffer.append(str1).append(' ').append("OR").append(' ').append(str2);
       return localStringBuffer.toString();
     case 32:
       localStringBuffer.append(str1).append(' ').append("ALL").append(' ').append(str2);
       return localStringBuffer.toString();
     case 33:
       localStringBuffer.append(str1).append(' ').append("ANY").append(' ').append(str2);
       return localStringBuffer.toString();
     case 30:
       localStringBuffer.append(str1).append(' ').append("IN").append(' ').append(str2);
       return localStringBuffer.toString();
     case 61:
       localStringBuffer.append(' ').append("CONVERT").append('(');
       localStringBuffer.append(str1).append(',');
       localStringBuffer.append(Types.getTypeString(this.dataType, this.precision, this.scale));
       localStringBuffer.append(')');
       return localStringBuffer.toString();
     case 62:
       localStringBuffer.append(' ').append("CASEWHEN").append('(');
       localStringBuffer.append(str1).append(',').append(str2).append(')');
       return localStringBuffer.toString();
     case 34:
       localStringBuffer.append(str1).append(' ').append("IS").append(' ').append("NULL");
       return localStringBuffer.toString();
     case 70:
       localStringBuffer.append(str1).append(',').append(str2);
       return localStringBuffer.toString();
     case 3:
       break;
     case 31:
       localStringBuffer.append(' ').append("EXISTS").append(' ');
       break;
     case 40:
       localStringBuffer.append(' ').append("COUNT").append('(');
       break;
     case 41:
       localStringBuffer.append(' ').append("SUM").append('(');
       localStringBuffer.append(str1).append(')');
       break;
     case 42:
       localStringBuffer.append(' ').append("MIN").append('(');
       localStringBuffer.append(str1).append(')');
       break;
     case 43:
       localStringBuffer.append(' ').append("MAX").append('(');
       localStringBuffer.append(str1).append(')');
       break;
     case 44:
       localStringBuffer.append(' ').append("AVG").append('(');
       localStringBuffer.append(str1).append(')');
       break;
     case 45:
       localStringBuffer.append(' ').append("EVERY").append('(');
       localStringBuffer.append(str1).append(')');
       break;
     case 46:
       localStringBuffer.append(' ').append("SOME").append('(');
       localStringBuffer.append(str1).append(')');
       break;
     case 47:
       localStringBuffer.append(' ').append("STDDEV_POP").append('(');
       localStringBuffer.append(str1).append(')');
       break;
     case 48:
       localStringBuffer.append(' ').append("STDDEV_SAMP").append('(');
       localStringBuffer.append(str1).append(')');
       break;
     case 49:
       localStringBuffer.append(' ').append("VAR_POP").append('(');
       localStringBuffer.append(str1).append(')');
       break;
     case 50:
       localStringBuffer.append(' ').append("VAR_SAMP").append('(');
       localStringBuffer.append(str1).append(')');
     case -3:
     case -2:
     case -1:
     case 0:
     case 8:
     case 9:
     case 16:
     case 17:
     case 18:
     case 19:
     case 35:
     case 36:
     case 37:
     case 38:
     case 39:
     case 51:
     case 52:
     case 53:
     case 54:
     case 55:
     case 56:
     case 57:
     case 58:
     case 59:
     case 60:
     case 63:
     case 64:
     case 65:
     case 66:
     case 67:
     case 68:
     case 69:
     }
     throw Trace.error(99);
   }
 
   private String describe(Session paramSessionint paramInt)
   {
     StringBuffer localStringBuffer = new StringBuffer(64);
     localStringBuffer.append('\n');
     for (int j = 0; j < paramInt; j++)
       localStringBuffer.append(' ');
     if (this.oldIType != -1)
       localStringBuffer.append("SET TRUE, WAS: ");
     int i = this.oldIType == -1 ? this.exprType : this.oldIType;
     switch (i)
     {
     case 7:
       localStringBuffer.append("FUNCTION ");
       localStringBuffer.append(this.function.describe(paramSession));
       return localStringBuffer.toString();
     case 1:
       if (this.isParam)
         localStringBuffer.append("PARAM ");
       localStringBuffer.append("VALUE = ").append(this.valueData);
       localStringBuffer.append(", TYPE = ").append(Types.getTypeString(this.dataType));
       return localStringBuffer.toString();
     case 2:
       localStringBuffer.append("COLUMN ");
       if (this.tableName != null)
       {
         localStringBuffer.append(this.tableName);
         localStringBuffer.append('.');
       }
       localStringBuffer.append(this.columnName);
       return localStringBuffer.toString();
     case 3:
       localStringBuffer.append("QUERY ");
       localStringBuffer.append(this.subQuery.select.describe(paramSession));
       return localStringBuffer.toString();
     case 4:
       localStringBuffer.append("TRUE ");
       break;
     case -4:
       localStringBuffer.append("FALSE ");
       break;
     case 5:
       localStringBuffer.append("VALUELIST ");
       localStringBuffer.append(" TYPE = ").append(Types.getTypeString(this.dataType));
       if (this.valueList == null)
         break;
       j = 0;
     case 6:
     case 10:
     case 11:
     case 12:
     case 13:
     case 14:
     case 15:
     case 20:
     case 21:
     case 22:
     case 23:
     case 24:
     case 25:
     case 26:
     case 27:
     case 28:
     case 29:
     case 32:
     case 33:
     case 30:
     case 34:
     case 31:
     case 40:
     case 41:
     case 42:
     case 43:
     case 44:
     case 45:
     case 46:
     case 47:
     case 48:
     case 49:
     case 50:
     case 61:
     case 62:
       while (j < this.valueList.length)
       {
         localStringBuffer.append(this.valueList[j].describe(paramSession, paramInt + paramInt));
         localStringBuffer.append(' ');
         j++;
         continue;
         localStringBuffer.append("* ");
         break;
         localStringBuffer.append("NEGATE ");
         break;
         localStringBuffer.append("ADD ");
         break;
         localStringBuffer.append("SUBTRACT ");
         break;
         localStringBuffer.append("MULTIPLY ");
         break;
         localStringBuffer.append("DIVIDE ");
         break;
         localStringBuffer.append("CONCAT ");
         break;
         localStringBuffer.append("NOT ");
         break;
         localStringBuffer.append("EQUAL ");
         break;
         localStringBuffer.append("BIGGER_EQUAL ");
         break;
         localStringBuffer.append("BIGGER ");
         break;
         localStringBuffer.append("SMALLER ");
         break;
         localStringBuffer.append("SMALLER_EQUAL ");
         break;
         localStringBuffer.append("NOT_EQUAL ");
         break;
         localStringBuffer.append("LIKE ");
         localStringBuffer.append(this.likeObject.describe(paramSession));
         break;
         localStringBuffer.append("AND ");
         break;
         localStringBuffer.append("OR ");
         break;
         localStringBuffer.append("ALL ");
         break;
         localStringBuffer.append("ANY ");
         break;
         localStringBuffer.append("IN ");
         break;
         localStringBuffer.append("IS_NULL ");
         break;
         localStringBuffer.append("EXISTS ");
         break;
         localStringBuffer.append("COUNT ");
         break;
         localStringBuffer.append("SUM ");
         break;
         localStringBuffer.append("MIN ");
         break;
         localStringBuffer.append("MAX ");
         break;
         localStringBuffer.append("AVG ");
         break;
         localStringBuffer.append("EVERY").append(' ');
         break;
         localStringBuffer.append("SOME").append(' ');
         break;
         localStringBuffer.append("STDDEV_POP").append(' ');
         break;
         localStringBuffer.append("STDDEV_SAMP").append(' ');
         break;
         localStringBuffer.append("VAR_POP").append(' ');
         break;
         localStringBuffer.append("VAR_SAMP").append(' ');
         break;
         localStringBuffer.append("CONVERT ");
         localStringBuffer.append(Types.getTypeString(this.dataType, this.precision, this.scale));
         localStringBuffer.append(' ');
         break;
         localStringBuffer.append("CASEWHEN ");
       }
     case -3:
     case -2:
     case -1:
     case 0:
     case 8:
     case 9:
     case 16:
     case 17:
     case 18:
     case 19:
     case 35:
     case 36:
     case 37:
     case 38:
     case 39:
     case 51:
     case 52:
     case 53:
     case 54:
     case 55:
     case 56:
     case 57:
     case 58:
     case 59:
     case 60:
     }
     if (this.isInJoin)
       localStringBuffer.append(" join");
     if (this.eArg != null)
     {
       localStringBuffer.append(" arg1=[");
       localStringBuffer.append(this.eArg.describe(paramSession, paramInt + 1));
       localStringBuffer.append(']');
     }
     if (this.eArg2 != null)
     {
       localStringBuffer.append(" arg2=[");
       localStringBuffer.append(this.eArg2.describe(paramSession, paramInt + 1));
       localStringBuffer.append(']');
     }
     return localStringBuffer.toString();
   }
 
   void setDataType(int paramInt)
   {
     this.dataType = paramInt;
   }
 
   void setTrue()
   {
     if (this.oldIType == -1)
       this.oldIType = this.exprType;
     this.exprType = 4;
   }
 
   void setNull()
   {
     this.isParam = false;
     this.exprType = 1;
     this.dataType = 0;
     this.valueData = null;
     this.eArg = null;
     this.eArg2 = null;
   }
 
   public boolean similarTo(Expression paramExpression)
   {
     if (paramExpression == null)
       return false;
     if (paramExpression == this)
       return true;
     return (this.exprType == paramExpression.exprType) && (this.dataType == paramExpression.dataType) && (equals(this.valueData, paramExpression.valueData)) && (equals(this.valueList, paramExpression.valueList)) && (equals(this.subQuery, paramExpression.subQuery)) && (equals(this.function, paramExpression.function)) && (equals(this.tableName, paramExpression.tableName)) && (equals(this.columnName, paramExpression.columnName)) && (similarTo(this.eArg, paramExpression.eArg)) && (similarTo(this.eArg2, paramExpression.eArg2));
   }
 
   static boolean equals(Object paramObject1Object paramObject2)
   {
     return paramObject1 == null ? false : paramObject2 == null ? true : paramObject1.equals(paramObject2);
   }
 
   static boolean equals(Expression[] paramArrayOfExpression1Expression[] paramArrayOfExpression2)
   {
     if (paramArrayOfExpression1 == paramArrayOfExpression2)
       return true;
     if (paramArrayOfExpression1.length != paramArrayOfExpression2.length)
       return false;
     int i = paramArrayOfExpression1.length;
     boolean bool = true;
     for (int j = 0; j < i; j++)
     {
       Expression localExpression1 = paramArrayOfExpression1[j];
       Expression localExpression2 = paramArrayOfExpression2[j];
       bool = localExpression1 == null ? false : localExpression2 == null ? true : localExpression1.equals(localExpression2);
     }
     return bool;
   }
 
   static boolean similarTo(Expression paramExpression1Expression paramExpression2)
   {
     return paramExpression1 == null ? false : paramExpression2 == null ? true : paramExpression1.similarTo(paramExpression2);
   }
 
   boolean canBeInGroupBy()
   {
     if (this.exprType == 7)
       return true;
     return (isColumn()) && (!isAggregate());
   }
 
   boolean canBeInOrderBy()
   {
     return (this.exprType == 7) || (this.joinedTableColumnIndex != -1) || (isColumn()) || (isAggregate());
   }
 
   private boolean isColumn()
   {
     switch (this.exprType)
     {
     case 2:
       return true;
     case 10:
       return this.eArg.isColumn();
     case 11:
     case 12:
     case 13:
     case 14:
     case 15:
       return (this.eArg.isColumn()) || (this.eArg2.isColumn());
     case 3:
     case 4:
     case 5:
     case 6:
     case 7:
     case 8:
     case 9:
     }
     return false;
   }
 
   boolean collectColumnName(HashSet paramHashSet)
   {
     int i = this.exprType == 2 ? 1 : 0;
     if (i != 0)
       paramHashSet.add(this.columnName);
     return i;
   }
 
   void collectAllColumnNames(HashSet paramHashSet)
   {
     if (!collectColumnName(paramHashSet))
     {
       if (this.eArg != null)
         this.eArg.collectAllColumnNames(paramHashSet);
       if (this.eArg2 != null)
         this.eArg2.collectAllColumnNames(paramHashSet);
     }
   }
 
   boolean isConstant()
   {
     switch (this.exprType)
     {
     case 1:
       return true;
     case 10:
       return this.eArg.isConstant();
     case 11:
     case 12:
     case 13:
     case 14:
     case 15:
       return (this.eArg.isConstant()) && (this.eArg2.isConstant());
     case 2:
     case 3:
     case 4:
     case 5:
     case 6:
     case 7:
     case 8:
     case 9:
     }
     return false;
   }
 
   boolean canBeInAggregate()
   {
     return (isAggregate()) || (isConstant());
   }
 
   boolean isAggregate()
   {
     return this.aggregateSpec != 0;
   }
 
   boolean isSelfAggregate()
   {
     return this.aggregateSpec == -1;
   }
 
   static boolean isAggregate(int paramInt)
   {
     switch (paramInt)
     {
     case 40:
     case 41:
     case 42:
     case 43:
     case 44:
     case 45:
     case 46:
     case 47:
     case 48:
     case 49:
     case 50:
       return true;
     }
     return false;
   }
 
   boolean isConditional()
   {
     switch (this.exprType)
     {
     case -4:
     case 4:
     case 21:
     case 22:
     case 23:
     case 24:
     case 25:
     case 26:
     case 27:
     case 30:
     case 31:
     case 34:
       return true;
     case 20:
       return this.eArg.isConditional();
     case 28:
     case 29:
       return (this.eArg.isConditional()) && (this.eArg2.isConditional());
     case -3:
     case -2:
     case -1:
     case 0:
     case 1:
     case 2:
     case 3:
     case 5:
     case 6:
     case 7:
     case 8:
     case 9:
     case 10:
     case 11:
     case 12:
     case 13:
     case 14:
     case 15:
     case 16:
     case 17:
     case 18:
     case 19:
     case 32:
     case 33:
     }
     return false;
   }
 
   void collectInGroupByExpressions(HsqlArrayList paramHsqlArrayList)
   {
     if ((!isConstant()) && (!isSelfAggregate()))
       if (isColumn())
         paramHsqlArrayList.add(this);
       else if (this.exprType != 7)
         if (this.exprType == 62)
         {
           this.eArg2.collectInGroupByExpressions(paramHsqlArrayList);
         }
         else
         {
           if (this.eArg != null)
            this.eArg.collectInGroupByExpressions(paramHsqlArrayList);
          if (this.eArg2 != null)
            this.eArg2.collectInGroupByExpressions(paramHsqlArrayList);
        }
  }
  void setDescending()
  {
    this.isDescending = true;
  }
  boolean isDescending()
  {
    return this.isDescending;
  }
  void setAlias(String paramStringboolean paramBoolean)
  {
    this.columnAlias = paramString;
    this.aliasQuoted = paramBoolean;
  }
  void setColumnName(String paramStringboolean paramBoolean)
  {
    this.columnName = paramString;
    this.columnQuoted = paramBoolean;
  }
  void setTableName(String paramString)
  {
    this.tableName = paramString;
  }
  {
    return this.columnAlias;
  }
  {
    if (this.columnAlias != null)
      return this.columnAlias;
    if (this.exprType == 2)
      return this.columnName;
    return "";
  }
  boolean isAliasQuoted()
  {
    if (this.columnAlias != null)
      return this.aliasQuoted;
    if (this.exprType == 2)
      return this.columnQuoted;
    return false;
  }
  int getType()
  {
    return this.exprType;
  }
  {
    return this.eArg;
  }
  {
    return this.eArg2;
  }
  {
    return this.tableFilter;
  }
  boolean checkResolved(boolean paramBoolean)
    throws HsqlException
  {
    int i = 1;
    if (this.eArg != null)
      i = (i != 0) && (this.eArg.checkResolved(paramBoolean)) ? 1 : 0;
    if (this.eArg2 != null)
      i = (i != 0) && (this.eArg2.checkResolved(paramBoolean)) ? 1 : 0;
    if ((this.subQuery != null) && (this.subQuery.select != null))
      i = (i != 0) && (this.subQuery.select.checkResolved(paramBoolean)) ? 1 : 0;
    if (this.function != null)
      i = (i != 0) && (this.function.checkResolved(paramBoolean)) ? 1 : 0;
    if (this.valueList != null)
      for (int j = 0; j < this.valueList.length; j++)
        i = (i != 0) && (this.valueList[j].checkResolved(paramBoolean)) ? 1 : 0;
    if (this.exprType == 2)
      if (this.tableFilter == null)
      {
        i = this.joinedTableColumnIndex != -1 ? 1 : 0;
        if ((i == 0) && (paramBoolean))
        {
          String str = this.tableName + "." + this.columnName;
          throw Trace.error(28, str);
        }
      }
      else
      {
        this.tableFilter.usedColumns[this.columnIndex] = true;
      }
    return i;
  }
  void checkTables(HsqlArrayList paramHsqlArrayList)
    throws HsqlException
  {
    if ((paramHsqlArrayList == null) || (this.exprType == 1))
      return;
    if (this.eArg != null)
      this.eArg.checkTables(paramHsqlArrayList);
    if (this.eArg2 != null)
      this.eArg2.checkTables(paramHsqlArrayList);
    switch (this.exprType)
    {
    case 2:
      int i = 0;
      int j = paramHsqlArrayList.size();
      for (int k = 0; k < j; k++)
      {
        TableFilter localTableFilter = (TableFilter)paramHsqlArrayList.get(k);
        String str = localTableFilter.getName();
        if ((this.tableName != null) && (!str.equals(this.tableName)))
          continue;
        Table localTable = localTableFilter.getTable();
        int n = localTable.findColumn(this.columnName);
        if (n == -1)
          continue;
        if (this.tableName == null)
        {
          if (i != 0)
            throw Trace.error(156, this.columnName);
          i = 1;
        }
        else
        {
          return;
        }
      }
      if (i != 0)
        return;
      throw Trace.error(28, this.columnName);
    case 3:
      break;
    case 7:
      if (this.function == null)
        break;
      this.function.checkTables(paramHsqlArrayList);
      break;
    case 32:
    case 33:
      break;
    case 30:
      if (this.eArg2.exprType == 3)
        break;
      Expression[] arrayOfExpression = this.eArg2.valueList;
      for (int m = 0; m < arrayOfExpression.length; m++)
        arrayOfExpression[m].checkTables(paramHsqlArrayList);
    }
  }
  Expression getExpressionForAlias(Expression[] paramArrayOfExpressionint paramInt)
  {
    for (int i = 0; i < paramInt; i++)
      if ((this.columnName.equals(paramArrayOfExpression[i].columnAlias)) && ((this.tableName == null) || (this.tableName.equals(paramArrayOfExpression[i].tableName))))
        return paramArrayOfExpression[i];
    return this;
  }
  void replaceAliases(Expression[] paramArrayOfExpressionint paramInt)
    throws HsqlException
  {
    if (this.eArg != null)
      if (this.eArg.exprType == 2)
        this.eArg = this.eArg.getExpressionForAlias(paramArrayOfExpression, paramInt);
      else
        this.eArg.replaceAliases(paramArrayOfExpression, paramInt);
    if (this.eArg2 != null)
      if (this.eArg2.exprType == 2)
        this.eArg2 = this.eArg2.getExpressionForAlias(paramArrayOfExpression, paramInt);
      else
        this.eArg2.replaceAliases(paramArrayOfExpression, paramInt);
    switch (this.exprType)
    {
    case 3:
      break;
    case 7:
      if (this.function == null)
        break;
      this.function.replaceAliases(paramArrayOfExpression, paramInt);
      break;
    case 32:
    case 33:
      break;
    case 30:
      if (this.eArg2.exprType == 3)
        break;
      Expression[] arrayOfExpression = this.eArg2.valueList;
      for (int i = 0; i < arrayOfExpression.length; i++)
        if (arrayOfExpression[i].exprType == 2)
          arrayOfExpression[i] = arrayOfExpression[i].getExpressionForAlias(paramArrayOfExpression, paramInt);
        else
          arrayOfExpression[i].replaceAliases(paramArrayOfExpression, paramInt);
    }
  }
    throws HsqlException
  {
    if (this.eArg != null)
      this.eArg.setLikeOptimised();
    if (this.eArg2 != null)
      this.eArg2.setLikeOptimised();
    if (this.exprType == 27)
      this.likeObject.optimised = true;
  }
  void getEquiJoinColumns(TableFilter paramTableFilterboolean[] paramArrayOfBooleanExpression[] paramArrayOfExpression)
  {
    if (this.eArg != null)
      this.eArg.getEquiJoinColumns(paramTableFilter, paramArrayOfBoolean, paramArrayOfExpression);
    if (this.eArg2 != null)
      this.eArg2.getEquiJoinColumns(paramTableFilter, paramArrayOfBoolean, paramArrayOfExpression);
    if (this.exprType == 21)
    {
      if (this.eArg.tableFilter == this.eArg2.tableFilter)
        return;
      if (this.eArg.tableFilter == paramTableFilter)
      {
        if ((this.eArg2.exprType == 2) || (this.eArg2.exprType == 1))
        {
          paramArrayOfBoolean[this.eArg.columnIndex] = true;
          paramArrayOfExpression[this.eArg.columnIndex] = this.eArg2;
        }
        return;
      }
      if ((this.eArg2.tableFilter == paramTableFilter) && ((this.eArg.exprType == 2) || (this.eArg.exprType == 1)))
      {
        paramArrayOfBoolean[this.eArg2.columnIndex] = true;
        paramArrayOfExpression[this.eArg2.columnIndex] = this.eArg;
      }
    }
  }
  TableFilter findTableFilter(TableFilter[] paramArrayOfTableFilter)
  {
    for (int i = 0; i < paramArrayOfTableFilter.length; i++)
    {
      TableFilter localTableFilter = paramArrayOfTableFilter[i];
      if (((this.schema == null) || (localTableFilter.filterTable.getSchemaName().equals(this.schema))) && (localTableFilter.getName().equals(this.tableName)))
        return localTableFilter;
    }
    return null;
  }
  void resolveTables(TableFilter paramTableFilter)
    throws HsqlException
  {
    if ((this.isParam) || (paramTableFilter == null) || (this.exprType == 1))
      return;
    if (this.eArg != null)
      this.eArg.resolveTables(paramTableFilter);
    if (this.eArg2 != null)
      this.eArg2.resolveTables(paramTableFilter);
    Object localObject;
    int i;
    switch (this.exprType)
    {
    case 2:
      if (this.tableFilter != null)
        break;
      String str = paramTableFilter.getName();
      if ((this.tableName != null) && (!this.tableName.equals(str)))
        break;
      localObject = paramTableFilter.getTable();
      i = ((Table)localObject).findColumn(this.columnName);
      if (i == -1)
        break;
      this.tableFilter = paramTableFilter;
      this.columnIndex = i;
      this.tableName = str;
      setTableColumnAttributes((Table)localObject, i);
      return;
    case 3:
      if (this.subQuery == null)
        break;
      this.subQuery.select.resolveTablesUnion(paramTableFilter);
      break;
    case 7:
      if (this.function == null)
        break;
      this.function.resolveTables(paramTableFilter);
      break;
    case 32:
    case 33:
      break;
    case 30:
      if (this.eArg2.exprType == 3)
        break;
      localObject = this.eArg2.valueList;
      for (i = 0; i < localObject.length; i++)
        localObject[i].resolveTables(paramTableFilter);
    }
  }
  int getCaseWhenType(Session paramSession)
    throws HsqlException
  {
    return this.eArg2.dataType;
  }
  void resolveTypes(Session paramSession)
    throws HsqlException
  {
    if (this.isParam)
      return;
    if (this.eArg != null)
      this.eArg.resolveTypes(paramSession);
    if (this.eArg2 != null)
      this.eArg2.resolveTypes(paramSession);
    boolean bool1;
    boolean bool2;
    Object localObject2;
    Object localObject3;
    Object localObject1;
    switch (this.exprType)
    {
    case 1:
      if ((this.dataType == 16) && (this.valueData != null))
        this.exprType = (((Boolean)this.valueData).booleanValue() ? 4 : -4);
      break;
    case 2:
      break;
    case 7:
      this.function.resolveType(paramSession);
      this.dataType = this.function.getReturnType();
      break;
    case 3:
      this.subQuery.select.resolveTypes(paramSession);
      this.dataType = this.subQuery.select.exprColumns[0].dataType;
      break;
    case 10:
      if (this.eArg.isParam)
        throw Trace.error(216, 212);
      this.dataType = this.eArg.dataType;
      if (isFixedConstant())
      {
        this.valueData = getValue(paramSession, this.dataType);
        this.eArg = null;
        this.exprType = 1;
      }
      break;
    case 11:
      if ((!Types.isCharacterType(this.eArg.dataType)) && (!Types.isCharacterType(this.eArg2.dataType)))
        break;
      this.exprType = 15;
      this.dataType = 12;
      if (isFixedConstant())
      {
        this.valueData = getValue(paramSession, this.dataType);
        this.eArg = null;
        this.eArg2 = null;
        this.exprType = 1;
      }
      else
      {
        if (this.eArg.isParam)
          this.eArg.dataType = 12;
        if (this.eArg2.isParam)
          this.eArg2.dataType = 12;
      }
      break;
    case 12:
    case 13:
    case 14:
      if ((this.eArg.isParam) && (this.eArg2.isParam))
        throw Trace.error(216, 213);
      if (isFixedConstant())
      {
        this.dataType = Column.getCombinedNumberType(this.eArg.dataType, this.eArg2.dataType, this.exprTy