/// <summary>
        /// Fetch definition of fields from the database.  SQL property must be assigned
        /// </summary>
        public void Describe()
        {
            if (described && !sql_changed)
            {
                return;
            }
            else if (statement != -1)
            {
                Free(false);
            }

            if (SQL == "")
            {
                throw new CliError("SQL not assigned!");
            }
            string s = GetTableName();

            if (SQL == "")
            {
                throw new CliError("Error parsing table name from the SQL!");
            }

            if (fields.Count == 0)
            {
                fields.Assign(connection.DescribeTable(GetTableName()));
            }
            statement = CLI.CliCheck(CLI.cli_statement(connection.Session, sql), "cli_statement failed");
            fields.Bind(statement);
            vars.Bind(statement);
            described   = true;
            sql_changed = false;
        }