private Expression ReadTerm() { Expression r = null; if (iToken == ExpressionType.DatabaseColumn) { string name = sToken; r = new Expression (sTable, sToken); Read (); if (iToken == ExpressionType.Open) { Function f = new Function (dDatabase.GetAlias (name), cChannel); /*int len = */f.GetArgCount (); int i = 0; Read (); if (iToken != ExpressionType.Close) { while (true) { f.SetArgument (i++, ReadOr ()); if (iToken != ExpressionType.Comma) { break; } Read (); } } ReadThis (ExpressionType.Close); r = new Expression (f); } } else if (iToken == ExpressionType.Negate) { ExpressionType type = iToken; Read (); r = new Expression (type, ReadTerm (), null); } else if (iToken == ExpressionType.Plus) { Read (); r = ReadTerm (); } else if (iToken == ExpressionType.Open) { Read (); r = ReadOr (); if (iToken != ExpressionType.Close) { throw TracingHelper.Error (TracingHelper.UnexpectedToken, sToken); } Read (); } else if (iToken == ExpressionType.Value) { r = new Expression (iType, oData); Read (); } else if (iToken == ExpressionType.Select) { r = new Expression (ParseSelect ()); Read (); } else if (iToken == ExpressionType.Multiply) { r = new Expression (sTable, null); Read (); } else if (iToken == ExpressionType.IfNull || iToken == ExpressionType.Concat) { ExpressionType type = iToken; Read (); ReadThis (ExpressionType.Open); r = ReadOr (); ReadThis (ExpressionType.Comma); r = new Expression (type, r, ReadOr ()); ReadThis (ExpressionType.Close); } else if (iToken == ExpressionType.CaseWhen) { ExpressionType type = iToken; Read (); ReadThis (ExpressionType.Open); r = ReadOr (); ReadThis (ExpressionType.Comma); Expression thenelse = ReadOr (); ReadThis (ExpressionType.Comma); // thenelse part is never evaluated; only init thenelse = new Expression (type, thenelse, ReadOr ()); r = new Expression (type, r, thenelse); ReadThis (ExpressionType.Close); } else if (iToken == ExpressionType.Convert) { ExpressionType type = iToken; Read (); ReadThis (ExpressionType.Open); r = ReadOr (); ReadThis (ExpressionType.Comma); ColumnType t = Column.GetColumnType (sToken); r = new Expression (type, r, null); r.SetDataType (t); Read (); ReadThis (ExpressionType.Close); } else if (iToken == ExpressionType.Cast) { Read (); ReadThis (ExpressionType.Open); r = ReadOr (); TracingHelper.Check (sToken.Equals ("AS"), TracingHelper.UnexpectedToken, sToken); Read (); ColumnType t = Column.GetColumnType (sToken); r = new Expression (ExpressionType.Convert, r, null); r.SetDataType (t); Read (); ReadThis (ExpressionType.Close); } else if (iToken == ExpressionType.Variable) { ExpressionType type = iToken; r = new Expression (null, sToken); r.Type = type; string columnType = tTokenizer.GetString (); if (Column.IsValidDataType (columnType)) { ColumnType iType = Column.GetColumnType (columnType); if (iType == ColumnType.VarChar && dDatabase.IsIgnoreCase) { iType = ColumnType.VarCharIgnoreCase; } r.SetDataType (iType); r.SetArg (null); } else { tTokenizer.Back (); Declare declare = cChannel.GetDeclare (r.ColumnName); if (declare != null) { r = declare.Expression; } else { throw TracingHelper.Error (TracingHelper.VARIABLE_NOT_DECLARED, sToken); } } Read (); } else if (iToken == ExpressionType.SquareBracketLeft) { ReadThis (ExpressionType.SquareBracketLeft); var t = ReadTerm (); if (t.Type != ExpressionType.DatabaseColumn) { throw TracingHelper.Error (TracingHelper.FIELD_OF_TABLE_IS_EXPECTED, /*tTokenizer.GetString()*/ "???"); } ReadThis (ExpressionType.SquareBracketRight); return t; } else { throw TracingHelper.Error (TracingHelper.UnexpectedToken, sToken); } return r; }