/*
 * Copyright (C) 2016-2022 ActionTech.
 * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher.
 */

package com.actiontech.dble.plan.common.field;

import com.actiontech.dble.config.Fields;
import com.actiontech.dble.plan.common.item.FieldTypes;

import java.util.List;

import static com.actiontech.dble.plan.common.field.FieldUtil.ItemResult.*;


public class FieldUtil {
    public static final int NOT_NULL_FLAG = 1; /* Field can't be NULL */
    public static final int PRI_KEY_FLAG = 2; /* Field is part of a primary key */
    public static final int UNIQUE_KEY_FLAG = 4; /* Field is part of a unique key */
    public static final int MULTIPLE_KEY_FLAG = 8; /* Field is part of a key */
    public static final int BLOB_FLAG = 16; /* Field is a blob */
    public static final int UNSIGNED_FLAG = 32; /* Field is unsigned */
    public static final int ZEROFILL_FLAG = 64; /* Field is zerofill */
    public static final int BINARY_FLAG = 128; /* Field is binary */

    /**
     * b1,b2 are int
     *
     * @param b1
     * @param b2
     * @return
     */
    public static int compareIntUsingStringBytes(byte[] b1, byte[] b2) {
        char b1c0 = (char) b1[0];
        char b2c0 = (char) b2[0];
        if (b1c0 == '-') { // b1<0
            if (b2c0 == '-') { // b2<0
                return -compareUnIntUsingStringBytes(b1, 1, b2, 1);
            } else {
                return -1;
            }
        } else { // b1>0
            if (b2c0 == '-') {
                return 1;
            } else {
                return compareUnIntUsingStringBytes(b1, 0, b2, 0);
            }
        }
    }

    /* b1,b2 are unsigned int*/
    private static int compareUnIntUsingStringBytes(byte[] b1, int startb1, byte[] b2, int startb2) {
        int b1len = b1.length - startb1;
        int b2len = b2.length - startb2;
        if (b1len < b2len)
            return -1;
        else if (b1len > b2len)
            return 1;
        else {
            // the length is equal
            for (int i = 0; i < b1len; i++) {
                byte bb1 = b1[startb1 + i];
                byte bb2 = b2[startb2 + i];
                if (bb1 > bb2)
                    return 1;
                else if (bb1 < bb2)
                    return -1;
                else
                    continue;
            }
            return 0;
        }
    }

    public int getEnumPackLength(int elements) {
        return elements < 256 ? 1 : 2;
    }

    public int getSetPackLength(int elements) {
        int len = (elements + 7) / 8;
        return len > 4 ? 8 : len;
    }

    public static void initFields(List<Field> fields, List<byte[]> bs) {
        int size = fields.size();
        for (int index = 0; index < size; index++) {
            fields.get(index).setPtr(bs.get(index));
        }
    }

    public static boolean isTemporalType(FieldTypes valuetype) {
        return valuetype == FieldTypes.MYSQL_TYPE_DATE || valuetype == FieldTypes.MYSQL_TYPE_DATETIME || valuetype == FieldTypes.MYSQL_TYPE_TIMESTAMP || valuetype == FieldTypes.MYSQL_TYPE_TIME || valuetype == FieldTypes.MYSQL_TYPE_NEWDATE;
    }

    /**
     * Tests if field real type is temporal, i.e. represents all existing
     * implementations of DATE, TIME, DATETIME or TIMESTAMP types in SQL.
     *
     * @param type Field real type, as returned by field->real_type()
     * @retval true If field real type is temporal
     * @retval false If field real type is not temporal
     */
    public static boolean isTemporalRealType(FieldTypes type) {
        if (type == FieldTypes.MYSQL_TYPE_TIME2 || type == FieldTypes.MYSQL_TYPE_TIMESTAMP2 || type == FieldTypes.MYSQL_TYPE_DATETIME2) {
            return true;
        } else {
            return FieldUtil.isTemporalType(type);
        }
    }

    public static boolean isTemporalTypeWithTime(FieldTypes type) {
        return type == FieldTypes.MYSQL_TYPE_TIME || type == FieldTypes.MYSQL_TYPE_DATETIME || type == FieldTypes.MYSQL_TYPE_TIMESTAMP;
    }

    public static boolean isTemporalTypeWithDate(FieldTypes valuetype) {
        return valuetype == FieldTypes.MYSQL_TYPE_DATE || valuetype == FieldTypes.MYSQL_TYPE_DATETIME || valuetype == FieldTypes.MYSQL_TYPE_TIMESTAMP;
    }

    /**
     * Tests if field type is temporal and has date and time parts, i.e.
     * represents DATETIME or TIMESTAMP types in SQL.
     *
     * @param type Field type, as returned by field->type().
     * @retval true If field type is temporal type with date and time parts.
     * @retval false If field type is not temporal type with date and time
     * parts.
     */
    public static boolean isTemporalTypeWithDateAndTime(FieldTypes type) {
        return type == FieldTypes.MYSQL_TYPE_DATETIME || type == FieldTypes.MYSQL_TYPE_TIMESTAMP;
    }

    /**
     * Recognizer for concrete data type (called real_type for some reason),
     * returning true if it is one of the TIMESTAMP types.
     */
    public static boolean isTimestampType(FieldTypes type) {
        return type == FieldTypes.MYSQL_TYPE_TIMESTAMP || type == FieldTypes.MYSQL_TYPE_TIMESTAMP2;
    }

    /**
     * Convert temporal real types as retuned by field->real_type() to field
     * type as returned by field->type().
     *
     * @param realType Real type.
     * @retval Field type.
     */
    public static FieldTypes realTypeToType(FieldTypes realType) {
        if (realType == FieldTypes.MYSQL_TYPE_TIME2) {
            return FieldTypes.MYSQL_TYPE_TIME;
        } else if (realType == FieldTypes.MYSQL_TYPE_DATETIME2) {
            return FieldTypes.MYSQL_TYPE_DATETIME;
        } else if (realType == FieldTypes.MYSQL_TYPE_TIMESTAMP2) {
            return FieldTypes.MYSQL_TYPE_TIMESTAMP;
        } else if (realType == FieldTypes.MYSQL_TYPE_NEWDATE) {
            return FieldTypes.MYSQL_TYPE_DATE;
            /* Note: NEWDECIMAL is a type, not only a real_type */
        } else {
            return realType;
        }
    }

    /*
     * Rules for merging different types of fields in UNION
     *
     * NOTE: to avoid 256*256 table, gap in table types numeration is skiped
     * following #defines describe that gap and how to canculate number of
     * fields and index of field in thia array.
     */
    private static final int FIELDTYPE_TEAR_FROM = (FieldTypes.MYSQL_TYPE_BIT.numberValue() + 1);
    private static final int FIELDTYPE_TEAR_TO = (FieldTypes.MYSQL_TYPE_JSON.numberValue() - 1);

    // private static int FIELDTYPE_NUM = (FIELDTYPE_TEAR_FROM + (255 -
    // FIELDTYPE_TEAR_TO));

    public static int fieldType2Index(FieldTypes fieldType) {
        fieldType = realTypeToType(fieldType);
        assert (fieldType.numberValue() < FIELDTYPE_TEAR_FROM || fieldType.numberValue() > FIELDTYPE_TEAR_TO);
        return (fieldType.numberValue() < FIELDTYPE_TEAR_FROM ? fieldType.numberValue() :
                FIELDTYPE_TEAR_FROM + (fieldType.numberValue() - FIELDTYPE_TEAR_TO) - 1);
    }

    public static FieldTypes fieldTypeMerge(FieldTypes a, FieldTypes b) {
        return FIELD_TYPES_MERGE_RULES[fieldType2Index(a)][fieldType2Index(b)];
    }

    public static ItemResult resultMergeType(FieldTypes fieldType) {
        return FIELD_TYPES_RESULT_TYPE[fieldType2Index(fieldType)];
    }

    public enum ItemResult {
        STRING_RESULT, REAL_RESULT, INT_RESULT, ROW_RESULT,
        DECIMAL_RESULT
    }

    ;

    private static final ItemResult[] FIELD_TYPES_RESULT_TYPE = new ItemResult[]{
            //MYSQL_TYPE_DECIMAL      MYSQL_TYPE_TINY
            DECIMAL_RESULT, INT_RESULT,
            //MYSQL_TYPE_SHORT        MYSQL_TYPE_LONG
            INT_RESULT, INT_RESULT,
            //MYSQL_TYPE_FLOAT        MYSQL_TYPE_DOUBLE
            REAL_RESULT, REAL_RESULT,
            //MYSQL_TYPE_NULL         MYSQL_TYPE_TIMESTAMP
            STRING_RESULT, STRING_RESULT,
            //MYSQL_TYPE_LONGLONG     MYSQL_TYPE_INT24
            INT_RESULT, INT_RESULT,
            //MYSQL_TYPE_DATE         MYSQL_TYPE_TIME
            STRING_RESULT, STRING_RESULT,
            //MYSQL_TYPE_DATETIME     MYSQL_TYPE_YEAR
            STRING_RESULT, INT_RESULT,
            //MYSQL_TYPE_NEWDATE      MYSQL_TYPE_VARCHAR
            STRING_RESULT, STRING_RESULT,
            //MYSQL_TYPE_BIT          <16>-<244>
            STRING_RESULT,
            //MYSQL_TYPE_JSON
            STRING_RESULT,
            //MYSQL_TYPE_NEWDECIMAL   MYSQL_TYPE_ENUM
            DECIMAL_RESULT, STRING_RESULT,
            //MYSQL_TYPE_SET          MYSQL_TYPE_TINY_BLOB
            STRING_RESULT, STRING_RESULT,
            //MYSQL_TYPE_MEDIUM_BLOB  MYSQL_TYPE_LONG_BLOB
            STRING_RESULT, STRING_RESULT,
            //MYSQL_TYPE_BLOB         MYSQL_TYPE_VAR_STRING
            STRING_RESULT, STRING_RESULT,
            //MYSQL_TYPE_STRING       MYSQL_TYPE_GEOMETRY
            STRING_RESULT, STRING_RESULT,
    };

    private static final FieldTypes[][] FIELD_TYPES_MERGE_RULES = new FieldTypes[][]{
            /* enum_field_types.MYSQL_TYPE_DECIMAL -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_NEWDECIMAL,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_NEWDECIMAL,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_DOUBLE, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_DECIMAL, FieldTypes.MYSQL_TYPE_DECIMAL,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_TINY -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_TINY,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_SHORT, FieldTypes.MYSQL_TYPE_LONG,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_FLOAT, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_TINY, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_LONGLONG, FieldTypes.MYSQL_TYPE_INT24,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_SHORT -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_SHORT,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_SHORT, FieldTypes.MYSQL_TYPE_LONG,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_FLOAT, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_SHORT, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_LONGLONG, FieldTypes.MYSQL_TYPE_INT24,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_SHORT,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_LONG -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_LONG,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_LONG, FieldTypes.MYSQL_TYPE_LONG,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_DOUBLE, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_LONG, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_LONGLONG, FieldTypes.MYSQL_TYPE_LONG,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_LONG,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_FLOAT -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_DOUBLE, FieldTypes.MYSQL_TYPE_FLOAT,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_FLOAT, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_FLOAT, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_FLOAT, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_FLOAT, FieldTypes.MYSQL_TYPE_FLOAT,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_FLOAT,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_DOUBLE, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_DOUBLE -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_DOUBLE, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_DOUBLE, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_DOUBLE, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_DOUBLE, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_DOUBLE, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_DOUBLE, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_NULL -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_TINY,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_SHORT, FieldTypes.MYSQL_TYPE_LONG,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_FLOAT, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_NULL, FieldTypes.MYSQL_TYPE_TIMESTAMP,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_LONGLONG, FieldTypes.MYSQL_TYPE_LONGLONG,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_NEWDATE, FieldTypes.MYSQL_TYPE_TIME,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_DATETIME, FieldTypes.MYSQL_TYPE_YEAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_NEWDATE, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_BIT,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_JSON,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_ENUM,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_SET, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_GEOMETRY},
            /* enum_field_types.MYSQL_TYPE_TIMESTAMP -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_TIMESTAMP, FieldTypes.MYSQL_TYPE_TIMESTAMP,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_DATETIME, FieldTypes.MYSQL_TYPE_DATETIME,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_DATETIME, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_DATETIME, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_LONGLONG -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_LONGLONG,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_LONGLONG, FieldTypes.MYSQL_TYPE_LONGLONG,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_DOUBLE, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_LONGLONG, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_LONGLONG, FieldTypes.MYSQL_TYPE_LONG,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_LONGLONG,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_NEWDATE, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_INT24 -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_INT24,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_INT24, FieldTypes.MYSQL_TYPE_LONG,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_FLOAT, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_INT24, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_LONGLONG, FieldTypes.MYSQL_TYPE_INT24,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_INT24,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_NEWDATE, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_DATE -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_NEWDATE, FieldTypes.MYSQL_TYPE_DATETIME,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_NEWDATE, FieldTypes.MYSQL_TYPE_DATETIME,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_DATETIME, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_NEWDATE, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_TIME -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_TIME, FieldTypes.MYSQL_TYPE_DATETIME,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_DATETIME, FieldTypes.MYSQL_TYPE_TIME,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_DATETIME, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_NEWDATE, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_DATETIME -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_DATETIME, FieldTypes.MYSQL_TYPE_DATETIME,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_DATETIME, FieldTypes.MYSQL_TYPE_DATETIME,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_DATETIME, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_DATETIME, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_YEAR -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_DECIMAL, FieldTypes.MYSQL_TYPE_TINY,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_SHORT, FieldTypes.MYSQL_TYPE_LONG,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_FLOAT, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_YEAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_LONGLONG, FieldTypes.MYSQL_TYPE_INT24,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_YEAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_NEWDATE -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_NEWDATE, FieldTypes.MYSQL_TYPE_DATETIME,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_NEWDATE, FieldTypes.MYSQL_TYPE_DATETIME,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_DATETIME, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_NEWDATE, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_VARCHAR -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_BIT -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_BIT, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_BIT,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* MYSQL_TYPE_JSON -> */
            {
                    //MYSQL_TYPE_DECIMAL      MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_SHORT        MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    //FieldTypes.MYSQL_TYPE_FLOAT        FieldTypes.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    //FieldTypes.MYSQL_TYPE_NULL         FieldTypes.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_JSON, FieldTypes.MYSQL_TYPE_VARCHAR,
                    //FieldTypes.MYSQL_TYPE_LONGLONG     FieldTypes.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    //FieldTypes.MYSQL_TYPE_DATE         FieldTypes.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    //FieldTypes.MYSQL_TYPE_DATETIME     FieldTypes.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    //FieldTypes.MYSQL_TYPE_NEWDATE      FieldTypes.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    //FieldTypes.MYSQL_TYPE_BIT          <16>-<244>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //FieldTypes.MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_JSON,
                    //FieldTypes.MYSQL_TYPE_NEWDECIMAL   FieldTypes.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    //FieldTypes.MYSQL_TYPE_SET          FieldTypes.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    //FieldTypes.MYSQL_TYPE_MEDIUM_BLOB  FieldTypes.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    //FieldTypes.MYSQL_TYPE_BLOB         FieldTypes.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    //FieldTypes.MYSQL_TYPE_STRING       FieldTypes.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_NEWDECIMAL -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_NEWDECIMAL,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_NEWDECIMAL,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_DOUBLE, FieldTypes.MYSQL_TYPE_DOUBLE,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_NEWDECIMAL,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_NEWDECIMAL,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_NEWDECIMAL, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_ENUM -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_ENUM, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_SET -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_SET, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_TINY_BLOB -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_TINY_BLOB, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_TINY_BLOB, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_TINY_BLOB, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_TINY_BLOB, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_TINY_BLOB, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_TINY_BLOB, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_TINY_BLOB, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_TINY_BLOB, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_TINY_BLOB, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_TINY_BLOB, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_TINY_BLOB, FieldTypes.MYSQL_TYPE_TINY_BLOB},
            /* enum_field_types.MYSQL_TYPE_MEDIUM_BLOB -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_MEDIUM_BLOB,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_MEDIUM_BLOB,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_MEDIUM_BLOB,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_MEDIUM_BLOB,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_MEDIUM_BLOB,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_MEDIUM_BLOB,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_MEDIUM_BLOB,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_MEDIUM_BLOB,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_MEDIUM_BLOB,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_MEDIUM_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_MEDIUM_BLOB,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_MEDIUM_BLOB},
            /* enum_field_types.MYSQL_TYPE_LONG_BLOB -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_LONG_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB},
            /* enum_field_types.MYSQL_TYPE_BLOB -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_BLOB,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_BLOB,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_BLOB,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_BLOB,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_BLOB,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_BLOB,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_BLOB,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_BLOB,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_BLOB,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_BLOB,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_BLOB,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_BLOB},
            /* enum_field_types.MYSQL_TYPE_VAR_STRING -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR},
            /* enum_field_types.MYSQL_TYPE_STRING -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_STRING,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_STRING,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_STRING,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_STRING,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_STRING,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_STRING,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_STRING,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_STRING,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_STRING,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_STRING,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_STRING},
            /* enum_field_types.MYSQL_TYPE_GEOMETRY -> */
            {
                    // enum_field_types.MYSQL_TYPE_DECIMAL
                    // enum_field_types.MYSQL_TYPE_TINY
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SHORT
                    // enum_field_types.MYSQL_TYPE_LONG
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_FLOAT
                    // enum_field_types.MYSQL_TYPE_DOUBLE
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NULL
                    // enum_field_types.MYSQL_TYPE_TIMESTAMP
                    FieldTypes.MYSQL_TYPE_GEOMETRY, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_LONGLONG
                    // enum_field_types.MYSQL_TYPE_INT24
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATE
                    // enum_field_types.MYSQL_TYPE_TIME
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_DATETIME
                    // enum_field_types.MYSQL_TYPE_YEAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDATE
                    // enum_field_types.MYSQL_TYPE_VARCHAR
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_BIT <16>-<245>
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    //MYSQL_TYPE_JSON
                    FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_NEWDECIMAL
                    // enum_field_types.MYSQL_TYPE_ENUM
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_SET
                    // enum_field_types.MYSQL_TYPE_TINY_BLOB
                    FieldTypes.MYSQL_TYPE_VARCHAR, FieldTypes.MYSQL_TYPE_TINY_BLOB,
                    // enum_field_types.MYSQL_TYPE_MEDIUM_BLOB
                    // enum_field_types.MYSQL_TYPE_LONG_BLOB
                    FieldTypes.MYSQL_TYPE_MEDIUM_BLOB, FieldTypes.MYSQL_TYPE_LONG_BLOB,
                    // enum_field_types.MYSQL_TYPE_BLOB
                    // enum_field_types.MYSQL_TYPE_VAR_STRING
                    FieldTypes.MYSQL_TYPE_BLOB, FieldTypes.MYSQL_TYPE_VARCHAR,
                    // enum_field_types.MYSQL_TYPE_STRING
                    // enum_field_types.MYSQL_TYPE_GEOMETRY
                    FieldTypes.MYSQL_TYPE_STRING, FieldTypes.MYSQL_TYPE_GEOMETRY,
            },
    };

    public static boolean isBinaryType(int dataType) {
        return dataType == Fields.FIELD_TYPE_MEDIUM_BLOB || dataType == Fields.FIELD_TYPE_BLOB || dataType == Fields.FIELD_TYPE_LONG_BLOB ||
                dataType == Fields.FIELD_TYPE_TINY_BLOB;
    }

    public static boolean isNumberType(int dataType) {
        return dataType == Fields.FIELD_TYPE_LONG || dataType == Fields.FIELD_TYPE_LONGLONG || dataType == Fields.FIELD_TYPE_TINY ||
                dataType == Fields.FIELD_TYPE_SHORT || dataType == Fields.FIELD_TYPE_BIT || dataType == Fields.FIELD_TYPE_NEW_DECIMAL ||
                dataType == Fields.FIELD_TYPE_FLOAT || dataType == Fields.FIELD_TYPE_DOUBLE;
    }

    public static boolean isNumberType(String dataType) {
        if (dataType == null) return false;
        dataType = dataType.toUpperCase();
        return dataType.contains("BIT") ||
                dataType.contains("TINYINT") ||
                dataType.contains("BOOL") ||
                dataType.contains("SMALLINT") ||
                dataType.contains("MEDIUMINT") ||
                dataType.contains("INT") ||
                dataType.contains("INTEGER") ||
                dataType.contains("BIGINT");
    }

}
