// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
// http:// www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package common;

option java_package = "org.apache.drill.common.types";
option java_outer_classname = "TypeProtos";
option optimize_for = SPEED;


enum MinorType {
    LATE = 0;   //  late binding type
    MAP = 1;   //  an empty map column.  Useful for conceptual setup.  Children listed within here

    TINYINT = 3;   //  single byte signed integer
    SMALLINT = 4;   //  two byte signed integer
    INT = 5;   //  four byte signed integer
    BIGINT = 6;   //  eight byte signed integer
    DECIMAL9 = 7;   //  a decimal supporting precision between 1 and 9
    DECIMAL18 = 8;   //  a decimal supporting precision between 10 and 18
    DECIMAL28SPARSE = 9;   //  a decimal supporting precision between 19 and 28
    DECIMAL38SPARSE = 10;   //  a decimal supporting precision between 29 and 38
    MONEY = 11;   //  signed decimal with two digit precision
    DATE = 12;   //  days since 4713bc
    TIME = 13;   //  time in micros before or after 2000/1/1
    TIMETZ = 14;   //  time in micros before or after 2000/1/1 with timezone
    TIMESTAMPTZ = 15;   //  unix epoch time in millis
    TIMESTAMP = 16;   //  TBD
    INTERVAL = 17;   //  TBD
    FLOAT4 = 18;   //  4 byte ieee 754
    FLOAT8 = 19;   //  8 byte ieee 754
    BIT = 20;   //  single bit value (boolean)
    FIXEDCHAR = 21;   //  utf8 fixed length string, padded with spaces
    FIXED16CHAR = 22;
    FIXEDBINARY = 23;   //  fixed length binary, padded with 0 bytes
    VARCHAR = 24;   //  utf8 variable length string
    VAR16CHAR = 25; // utf16 variable length string
    VARBINARY = 26;   //  variable length binary
    UINT1 = 29;   //  unsigned 1 byte integer
    UINT2 = 30;   //  unsigned 2 byte integer
    UINT4 = 31;   //  unsigned 4 byte integer
    UINT8 = 32;   //  unsigned 8 byte integer
    DECIMAL28DENSE = 33; // dense decimal representation, supporting precision between 19 and 28
    DECIMAL38DENSE = 34; // dense decimal representation, supporting precision between 28 and 38
//    PROTO2 = 33;   //  protobuf encoded complex type. (up to 2^16 in length)
//    PROTO4 = 34;   //  protobuf encoded complex type. (up to 2^32 in length)
//    MSGPACK2 = 35;   //  msgpack encoded complex type. (up to 2^16 in length)
//    MSGPACK4 = 36;   //  msgpack encoded complex type. (up to 2^32 in length)
    NULL = 37; // a value of unknown type (e.g. a missing reference).
    INTERVALYEAR = 38; // Interval type specifying YEAR to MONTH
    INTERVALDAY = 39; // Interval type specifying DAY to SECONDS
    LIST = 40;
    GENERIC_OBJECT = 41;
    UNION = 42;
    VARDECIMAL = 43;  // variable width decimal (arbitrary precision)
}

message MajorType {
  optional MinorType minor_type = 1;
  optional DataMode mode = 2;
  optional int32 width = 3;
  optional int32 precision = 4; // used for decimal types or as optional length for fixed size value
  optional int32 scale = 5; // used for decimal types
  optional int32 timeZone = 6; // used by TimeStamp type
  repeated MinorType sub_type = 7; // used by Union type
}

enum DataMode {
  OPTIONAL = 0; // nullable
  REQUIRED = 1; // non-nullable
  REPEATED = 2; // single, repeated-field
}
