diff --git a/exec.c b/exec.c index 6919b48..d1d11d0 100644 --- a/exec.c +++ b/exec.c @@ -334,6 +334,11 @@ void sqlp_def_col(struct psql_state *pstate, int flags, const char *name) print_and_free(obj); } +void sqlp_data_type(struct psql_state *pstate, const char *type_name) +{ + strout("type", type_name); +} + void sqlp_delete(struct psql_state *pstate, int opts, const char *name) { json_t *obj = json_object(); diff --git a/pscan.js b/pscan.js index c1f678f..2b7a478 100755 --- a/pscan.js +++ b/pscan.js @@ -41,6 +41,8 @@ function parseRecordStream(recs) const rec = stk.pop(); if ('attr' in rec) objColumn.attr.push(rec); + else if ('type' in rec) + objColumn.type = rec.type; else if (rec.op && rec.op == 'START-COL') break; else { diff --git a/sql-parser.h b/sql-parser.h index cef4574..c78c34e 100644 --- a/sql-parser.h +++ b/sql-parser.h @@ -93,6 +93,7 @@ extern void sqlp_create_tbl_sel(struct psql_state *pstate, int temp, int if_n_ex extern void sqlp_create_sel(struct psql_state *pstate, int ignore_replace); extern void sqlp_date_interval(struct psql_state *pstate, enum sqlp_date_intervals interval); extern void sqlp_def_col(struct psql_state *pstate, int flags, const char *name); +extern void sqlp_data_type(struct psql_state *pstate, const char *type_name); extern void sqlp_delete(struct psql_state *pstate, int opts, const char *name); extern void sqlp_delete_multi(struct psql_state *pstate, int opts, int n_del, int n_tbl_ref); extern void sqlp_drop_db(struct psql_state *pstate, int if_exists, const char *name); diff --git a/sql.y b/sql.y index 0e54cf9..920249a 100644 --- a/sql.y +++ b/sql.y @@ -759,36 +759,36 @@ opt_csc: /* nil */ ; data_type: - BIT opt_length { $$ = 10000 + $2; } - | TINYINT opt_length opt_uz { $$ = 10000 + $2; } - | SMALLINT opt_length opt_uz { $$ = 20000 + $2 + $3; } - | MEDIUMINT opt_length opt_uz { $$ = 30000 + $2 + $3; } - | INT opt_length opt_uz { $$ = 40000 + $2 + $3; } - | INTEGER opt_length opt_uz { $$ = 50000 + $2 + $3; } - | BIGINT opt_length opt_uz { $$ = 60000 + $2 + $3; } - | REAL opt_length opt_uz { $$ = 70000 + $2 + $3; } - | DOUBLE opt_length opt_uz { $$ = 80000 + $2 + $3; } - | FLOAT opt_length opt_uz { $$ = 90000 + $2 + $3; } - | DECIMAL opt_length opt_uz { $$ = 110000 + $2 + $3; } - | DATE { $$ = 100001; } - | TIME { $$ = 100002; } - | TIMESTAMP { $$ = 100003; } - | DATETIME { $$ = 100004; } - | YEAR { $$ = 100005; } - | CHAR opt_length opt_csc { $$ = 120000 + $2; } - | VARCHAR '(' INTNUM ')' opt_csc { $$ = 130000 + $3; } - | BINARY opt_length { $$ = 140000 + $2; } - | VARBINARY '(' INTNUM ')' { $$ = 150000 + $3; } - | TINYBLOB { $$ = 160001; } - | BLOB { $$ = 160002; } - | MEDIUMBLOB { $$ = 160003; } - | LONGBLOB { $$ = 160004; } - | TINYTEXT opt_binary opt_csc { $$ = 170000 + $2; } - | TEXT opt_binary opt_csc { $$ = 171000 + $2; } - | MEDIUMTEXT opt_binary opt_csc { $$ = 172000 + $2; } - | LONGTEXT opt_binary opt_csc { $$ = 173000 + $2; } - | ENUM '(' enum_list ')' opt_csc { $$ = 200000 + $3; } - | SET '(' enum_list ')' opt_csc { $$ = 210000 + $3; } + BIT opt_length { sqlp_data_type(pstate, "BIT"); $$ = 10000 + $2; } + | TINYINT opt_length opt_uz { sqlp_data_type(pstate, "TINYINT"); $$ = 10000 + $2; } + | SMALLINT opt_length opt_uz { sqlp_data_type(pstate, "SMALLINT"); $$ = 20000 + $2 + $3; } + | MEDIUMINT opt_length opt_uz { sqlp_data_type(pstate, "MEDIUMINT"); $$ = 30000 + $2 + $3; } + | INT opt_length opt_uz { sqlp_data_type(pstate, "INT"); $$ = 40000 + $2 + $3; } + | INTEGER opt_length opt_uz { sqlp_data_type(pstate, "INTEGER"); $$ = 50000 + $2 + $3; } + | BIGINT opt_length opt_uz { sqlp_data_type(pstate, "BIGINT"); $$ = 60000 + $2 + $3; } + | REAL opt_length opt_uz { sqlp_data_type(pstate, "REAL"); $$ = 70000 + $2 + $3; } + | DOUBLE opt_length opt_uz { sqlp_data_type(pstate, "DOUBLE"); $$ = 80000 + $2 + $3; } + | FLOAT opt_length opt_uz { sqlp_data_type(pstate, "FLOAT"); $$ = 90000 + $2 + $3; } + | DECIMAL opt_length opt_uz { sqlp_data_type(pstate, "DECIMAL"); $$ = 110000 + $2 + $3; } + | DATE { sqlp_data_type(pstate, "DATE"); $$ = 100001; } + | TIME { sqlp_data_type(pstate, "TIME"); $$ = 100002; } + | TIMESTAMP { sqlp_data_type(pstate, "TIMESTAMP"); $$ = 100003; } + | DATETIME { sqlp_data_type(pstate, "DATETIME"); $$ = 100004; } + | YEAR { sqlp_data_type(pstate, "YEAR"); $$ = 100005; } + | CHAR opt_length opt_csc { sqlp_data_type(pstate, "CHAR"); $$ = 120000 + $2; } + | VARCHAR '(' INTNUM ')' opt_csc { sqlp_data_type(pstate, "VARCHAR"); $$ = 130000 + $3; } + | BINARY opt_length { sqlp_data_type(pstate, "BINARY"); $$ = 140000 + $2; } + | VARBINARY '(' INTNUM ')' { sqlp_data_type(pstate, "VARBINARY"); $$ = 150000 + $3; } + | TINYBLOB { sqlp_data_type(pstate, "TINYBLOB"); $$ = 160001; } + | BLOB { sqlp_data_type(pstate, "BLOB"); $$ = 160002; } + | MEDIUMBLOB { sqlp_data_type(pstate, "MEDIUMBLOB"); $$ = 160003; } + | LONGBLOB { sqlp_data_type(pstate, "LONGBLOB"); $$ = 160004; } + | TINYTEXT opt_binary opt_csc { sqlp_data_type(pstate, "TINYTEXT"); $$ = 170000 + $2; } + | TEXT opt_binary opt_csc { sqlp_data_type(pstate, "TEXT"); $$ = 171000 + $2; } + | MEDIUMTEXT opt_binary opt_csc { sqlp_data_type(pstate, "MEDIUMTEXT"); $$ = 172000 + $2; } + | LONGTEXT opt_binary opt_csc { sqlp_data_type(pstate, "LONGTEXT"); $$ = 173000 + $2; } + | ENUM '(' enum_list ')' opt_csc { sqlp_data_type(pstate, "ENUM"); $$ = 200000 + $3; } + | SET '(' enum_list ')' opt_csc { sqlp_data_type(pstate, "SET"); $$ = 210000 + $3; } ; enum_list: STRING { sqlp_enum_val(pstate, $1); free($1); $$ = 1; }