const unsigned long FLAG_AUTO_INCREMENT = 1;
    const unsigned long FLAG_CASE_SENSITIVE = 2;
    const unsigned long FLAG_CURRENCY = 4;
    const unsigned long FLAG_DEFINITELY_WRITABLE = 512;
    const unsigned long FLAG_NOT_NULLABLE = 8;
    const unsigned long FLAG_NULLABLE = 16;
    const unsigned long FLAG_READONLY = 32;
    const unsigned long FLAG_SEARCHABLE = 64;
    const unsigned long FLAG_UNSIGNED = 128;
    const unsigned long FLAG_WRITABLE = 256;
    const long TYPE_BIGINT = -5;
    const long TYPE_BINARY = -2;
    const long TYPE_BIT = -7;
    const long TYPE_CHAR = 1;
    const long TYPE_DATE = 91;
    const long TYPE_DECIMAL = 3;
    const long TYPE_DOUBLE = 8;
    const long TYPE_FLOAT = 6;
    const long TYPE_INTEGER = 4;
    const long TYPE_LONGVARBINARY = -4;
    const long TYPE_LONGVARCHAR = -1;
    const long TYPE_NUMERIC = 2;
    const long TYPE_REAL = 7;
    const long TYPE_SMALLINT = 5;
    const long TYPE_TIME = 92;
    const long TYPE_TIMESTAMP = 93;
    const long TYPE_TINYINT = -6;
    const long TYPE_VARBINARY = -3;
    const long TYPE_VARCHAR = 12;
    typedef sequence < BCD::Binary > BinarySeq;
    typedef sequence < boolean > BooleanSeq;
A result column consists of meta data and data values, as well as a sequence indicating which rows contain null values. The length of 'nulls' may be less than the number of result rows. The default value if a row's 'nulls' entry is not present is false (i.e. non-null). This optimisation is particularly useful when the column's 'flags' contains the FLAG_NOT_NULLABLE bit.
    struct Column
    {
        unsigned long flags;
        unsigned long width;
        unsigned long scale;
        string name;
        string label;
        TabularResults::Data values;
        TabularResults::BooleanSeq nulls;
    };
    
The precision for floating-point decimal values is calculated as 'width - sign - dot', where sign = 1 if the flags bit FLAG_UNSIGNED is set (otherwise sign = 0), and dot = 1 if scale > 0 (otherwise dot = 0).
The scale must be zero for TYPE_BIGINT.
    typedef sequence < TabularResults::Column > ColumnSeq;
 The Data type represents an entire column in a result set.
 Data is stored in a result set in column-major order. This means the
 column data type (the union discriminator) only needs to be transmitted
 over the network once, and minimises padding when using GIOP.
 
    union Data switch (long)
    {
        case TYPE_BIT: TabularResults::BooleanSeq booleanValues;
        case TYPE_TINYINT: TabularResults::OctetSeq octetValues;
        case TYPE_SMALLINT: TabularResults::ShortSeq shortValues;
        case TYPE_INTEGER: TabularResults::LongSeq longValues;
        case TYPE_REAL: TabularResults::FloatSeq floatValues;
        case TYPE_DOUBLE: case TYPE_FLOAT: TabularResults::DoubleSeq doubleValues;
        case TYPE_CHAR: case TYPE_LONGVARCHAR: case TYPE_VARCHAR: TabularResults::StringSeq stringValues;
        case TYPE_BINARY: case TYPE_LONGVARBINARY: case TYPE_VARBINARY: TabularResults::BinarySeq binaryValues;
        case TYPE_BIGINT: case TYPE_DECIMAL: case TYPE_NUMERIC: TabularResults::DecimalSeq decimalValues;
        case TYPE_DATE: TabularResults::DateSeq dateValues;
        case TYPE_TIME: TabularResults::TimeSeq timeValues;
        case TYPE_TIMESTAMP: TabularResults::TimestampSeq timestampValues;
    };
    
Notes:
    typedef sequence < MJD::Date > DateSeq;
    typedef sequence < BCD::Decimal > DecimalSeq;
    typedef sequence < double > DoubleSeq;
    typedef sequence < float > FloatSeq;
    typedef sequence < long > LongSeq;
    typedef sequence < octet > OctetSeq;
 The ResultSet type may be used as the return type
 for an operation returning a single result set.
    struct ResultSet
    {
        unsigned long rows;
        TabularResults::ColumnSeq columns;
    };
    
 The ResultSets type may be used as the return type
 for an operation returning multiple result sets.
    typedef sequence < TabularResults::ResultSet > ResultSets;
    typedef sequence < short > ShortSeq;
    typedef sequence < string > StringSeq;
    typedef sequence < MJD::Time > TimeSeq;
    typedef sequence < MJD::Timestamp > TimestampSeq;