public IType FindFunctionReturnType(String functionName, IASTNode first)
        {
            // locate the registered function by the given name
            ISQLFunction sqlFunction = RequireSQLFunction(functionName);

            // determine the type of the first argument...
            IType argumentType = null;

            if (first != null)
            {
                if (sqlFunction is CastFunction)
                {
                    argumentType = TypeFactory.HeuristicType(first.NextSibling.Text);
                }
                else if (first is SqlNode)
                {
                    argumentType = ((SqlNode)first).DataType;
                }
            }

            return(sqlFunction.ReturnType(argumentType, _sfi));
        }
		/// <summary>
		/// Find the function return type given the function name and the first argument expression node.
		/// </summary>
		/// <param name="functionName">The function name.</param>
		/// <param name="first">The first argument expression.</param>
		/// <returns>the function return type given the function name and the first argument expression node.</returns>
		public IType FindFunctionReturnType(String functionName, IASTNode first)
		{
			// locate the registered function by the given name
			ISQLFunction sqlFunction = RequireSQLFunction(functionName);

			// determine the type of the first argument...
			IType argumentType = null;

			if (first != null)
			{
				if (functionName == "cast")
				{
					argumentType = TypeFactory.HeuristicType(first.NextSibling.Text);
				}
				else if (first is SqlNode)
				{
					argumentType = ((SqlNode) first).DataType;
				}
			}

			return sqlFunction.ReturnType(argumentType, _sfi);
		}