syntax .sql-esc

state esc special
    char "0'\"bnrtZ\\%_" END special
    noeat END

syntax sql

state start code
    char "'" sq
    char '"' dq
    char -b bB b
    char -b xX x
    char -b a-zA-Z_\$ word
    char 0 zero
    char 1-9 int
    char . float
    char @ at
    char ` backtick
    char -- - dash
    char # comment
    char / slash
    eat this

state zero numeric
    char 0-9 int
    char . float
    # Only lowercase. Inconsistent with X'10ff'!
    char b bin
    char x hex
    noeat trailing

state int numeric
    char 0-9 this
    char . float
    noeat trailing

state float numeric
    char 0-9 this
    noeat trailing

state bin numeric
    char 01 bindigit
    eat start error

state bindigit numeric
    char 01 this
    noeat trailing

state hex numeric
    char 0-9a-fA-F hexdigit
    eat start error

state hexdigit numeric
    char 0-9a-fA-F this
    noeat trailing

state b code
    # Single quote only
    char \' bitstr
    noeat -b word

state bitstr
    recolor string 2
    noeat bitstrbit

state bitstrbit special
    char 01 this
    char "\n'" start string
    eat this error

state x code
    # Single quote only
    char \' hexstr
    noeat -b word

state hexstr
    recolor string 2
    noeat hexstreven

state hexstreven special
    char 0-9a-fA-F hexstrodd
    char "\n'" start string
    eat hexstrodd error

state hexstrodd special
    char 0-9a-fA-F hexstreven
    char "\n'" start error
    eat hexstreven error

state word code
    char -b a-zA-Z0-9_\$ this
    inlist keyword start
    inlist identifier start
    char . column code
    noeat start

state column
    char -b a-zA-Z0-9_\$ this
    noeat start

state at variable
    char a-zA-Z0-9._\$ variable
    char "'" sq
    char '"' dq
    char ` backtick
    eat start error

state variable
    char a-zA-Z0-9._\$ this
    noeat start

state sq string
    char "\n'" start string
    char \\ .sql-esc:this
    eat this

state dq string
    char "\n"\" start string
    char \\ .sql-esc:this
    eat this

state backtick constant
    char "\n`" start
    eat this

state dash comment
    char -- - maybe-comment
    recolor code 1
    noeat start

state maybe-comment comment
    char "\n" start
    # Control character or space required!
    char "\x01- " comment
    recolor code 2
    noeat start

state comment
    char "\n" start
    eat this

state slash comment
    char "*" maybe-c-comment
    recolor code 1
    noeat start

state maybe-c-comment comment
    char ! begin-special-comment
    noeat c-comment

state begin-special-comment
    recolor special 3
    noeat special-comment

state special-comment special
    char "*" scstar
    eat this

state scstar special
    char / start special
    noeat special-comment

state c-comment comment
    char "*" star
    eat this

state star comment
    char / start comment
    noeat c-comment

state trailing error
    char a-zA-Z0-9_\$ this
    noeat start

# FIXME: types should probably go to separate list
list -i keyword \
    ACCESSIBLE \
    ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN \
    BIGINT BINARY BLOB BOTH BY CALL CASCADE CASE CHANGE CHAR \
    CHARACTER CHECK COLLATE COLUMN CONDITION CONSTRAINT CONTINUE \
    CONVERT CREATE CROSS CURRENT_DATE CURRENT_TIME \
    CURRENT_TIMESTAMP CURRENT_USER CURSOR DATABASE DATABASES \
    DAY_HOUR DAY_MICROSECOND DAY_MINUTE DAY_SECOND DEC DECIMAL \
    DECLARE DEFAULT DELAYED DELETE DESC DESCRIBE DETERMINISTIC \
    DISTINCT DISTINCTROW DIV DOUBLE DROP DUAL EACH ELSE ELSEIF \
    ENCLOSED ESCAPED EXISTS EXIT EXPLAIN FALSE FETCH FLOAT FLOAT4 \
    FLOAT8 FOR FORCE FOREIGN FROM FULLTEXT GRANT GROUP HAVING \
    HIGH_PRIORITY HOUR_MICROSECOND HOUR_MINUTE HOUR_SECOND IF \
    IGNORE IN INDEX INFILE INNER INOUT INSENSITIVE INSERT INT INT1 \
    INT2 INT3 INT4 INT8 INTEGER INTERVAL INTO IS ITERATE JOIN KEY \
    KEYS KILL LEADING LEAVE LEFT LIKE LIMIT LINEAR LINES LOAD LOCALTIME \
    LOCALTIMESTAMP LOCK LONG LONGBLOB LONGTEXT LOOP LOW_PRIORITY \
    MASTER_BIND MASTER_SSL_VERIFY_SERVER_CERT \
    MATCH MAXVALUE MEDIUMBLOB MEDIUMINT MEDIUMTEXT MIDDLEINT \
    MINUTE_MICROSECOND MINUTE_SECOND MOD MODIFIES NATURAL NOT \
    NO_WRITE_TO_BINLOG NULL NUMERIC ON ONE_SHOT OPTIMIZE OPTION OPTIONALLY \
    OR ORDER OUT OUTER OUTFILE PARTITION PRECISION PRIMARY PROCEDURE PURGE RANGE \
    READ READS READ_WRITE REAL REFERENCES REGEXP RELEASE RENAME REPEAT \
    REPLACE REQUIRE RESIGNAL RESTRICT RETURN REVOKE RIGHT RLIKE SCHEMA \
    SCHEMAS SECOND_MICROSECOND SELECT SENSITIVE SEPARATOR SET \
    SHOW SIGNAL SMALLINT SPATIAL SPECIFIC SQL SQLEXCEPTION \
    SQLSTATE SQLWARNING SQL_BIG_RESULT SQL_CALC_FOUND_ROWS \
    SQL_SMALL_RESULT SSL STARTING STRAIGHT_JOIN TABLE TERMINATED \
    THEN TINYBLOB TINYINT TINYTEXT TO TRAILING TRIGGER TRUE UNDO \
    UNION UNIQUE UNLOCK UNSIGNED UPDATE USAGE USE USING UTC_DATE \
    UTC_TIME UTC_TIMESTAMP VALUES VARBINARY VARCHAR VARCHARACTER \
    VARYING WHEN WHERE WHILE WITH WRITE XOR YEAR_MONTH ZEROFILL

list -i identifier \
    ACTION BIT DATE ENUM NO TEXT TIME TIMESTAMP

default keyword identifier
default code column
