From 5f11c7e1e0996e7b24cfc9f64ed5b2adde4ba298 Mon Sep 17 00:00:00 2001 From: Jeff Garzik Date: Sun, 8 Nov 2009 21:16:50 -0500 Subject: [PATCH] emit() sweep: convert CREATE TABLE column definition/attribs/constraints Signed-off-by: Jeff Garzik --- exec.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++- sql-parser.h | 22 ++++++++++++++++++ sql.y | 30 ++++++++++++------------ 3 files changed, 100 insertions(+), 16 deletions(-) diff --git a/exec.c b/exec.c index 1acc7bd..1a66f0d 100644 --- a/exec.c +++ b/exec.c @@ -4,6 +4,63 @@ #include #include "sql-parser.h" +static const char *attr_names[] = { + [SCA_NOTNULL] = "SCA_NOTNULL", + [SCA_DEF_STR] = "SCA_DEF_STR", + [SCA_DEF_NUM] = "SCA_DEF_NUM", + [SCA_DEF_FLOAT] = "SCA_DEF_FLOAT", + [SCA_DEF_BOOL] = "SCA_DEF_BOOL", + [SCA_AUTOINC] = "SCA_AUTOINC", + [SCA_UNIQUE_KEY] = "SCA_UNIQUE_KEY", + [SCA_PRIMARY_KEY] = "SCA_PRIMARY_KEY", + [SCA_COMMENT] = "SCA_COMMENT", +}; + +void sqlp_col_attr(enum sqlp_col_attribs attr) +{ + printf("exec ATTR %s\n", attr_names[attr]); +} + +void sqlp_col_attr_uniq(int n_cols) +{ + printf("exec ATTR UNIQUE-KEY %d\n", n_cols); +} + +void sqlp_col_attr_comm(const char *comm) +{ + printf("exec ATTR COMMENT %s\n", comm); +} + +void sqlp_col_charset(const char *charset) +{ + printf("exec ATTR CHARSET %s\n", charset); +} + +void sqlp_col_collate(const char *collate) +{ + printf("exec ATTR COLLATE %s\n", collate); +} + +void sqlp_col_def_str(const char *str) +{ + printf("exec ATTR DEFAULT-STR %s\n", str); +} + +void sqlp_col_def_num(int num) +{ + printf("exec ATTR DEFAULT-NUM %d\n", num); +} + +void sqlp_col_def_float(float num) +{ + printf("exec ATTR DEFAULT-FLOAT %g\n", num); +} + +void sqlp_col_def_bool(int bool) +{ + printf("exec ATTR DEFAULT-BOOL %d\n", bool); +} + void sqlp_create_db(int if_ne, const char *name) { printf("exec CREATE-DB %d %s\n", if_ne, name); @@ -21,7 +78,7 @@ void sqlp_create_tbl(int temp, int if_n_exists, int n_cols, void sqlp_def_col(int flags, const char *name) { - printf("exec DEF-COL %d %s\n", flags, name); + printf("exec DEFINE-COL %d %s\n", flags, name); } void sqlp_drop_db(int if_exists, const char *name) @@ -34,6 +91,11 @@ void sqlp_drop_table(int temp, int if_exists, int n_tables) printf("exec DROP-TABLE %d %d %d\n", temp, if_exists, n_tables); } +void sqlp_enum_val(const char *val) +{ + printf("exec ENUM-VAL %s\n", val); +} + void sqlp_start_col(void) { printf("exec START-COL\n"); diff --git a/sql-parser.h b/sql-parser.h index e65f166..6c466f5 100644 --- a/sql-parser.h +++ b/sql-parser.h @@ -1,12 +1,34 @@ #ifndef __SQL_PARSER_H__ #define __SQL_PARSER_H__ +enum sqlp_col_attribs { + SCA_NOTNULL = (1 << 0), + SCA_DEF_STR = (1 << 1), + SCA_DEF_NUM = (1 << 2), + SCA_DEF_FLOAT = (1 << 3), + SCA_DEF_BOOL = (1 << 4), + SCA_AUTOINC = (1 << 5), + SCA_UNIQUE_KEY = (1 << 6), + SCA_PRIMARY_KEY = (1 << 7), + SCA_COMMENT = (1 << 8), +}; + +extern void sqlp_col_attr(enum sqlp_col_attribs attr); +extern void sqlp_col_attr_uniq(int n_cols); +extern void sqlp_col_attr_comm(const char *comm); +extern void sqlp_col_charset(const char *charset); +extern void sqlp_col_collate(const char *collate); +extern void sqlp_col_def_str(const char *str); +extern void sqlp_col_def_num(int num); +extern void sqlp_col_def_float(float num); +extern void sqlp_col_def_bool(int bool); extern void sqlp_create_db(int if_n_exists, const char *name); extern void sqlp_create_tbl(int temp, int if_n_exists, int n_cols, const char *db_name, const char *name); extern void sqlp_def_col(int flags, const char *name); extern void sqlp_drop_db(int if_exists, const char *name); extern void sqlp_drop_table(int temp, int if_exists, int n_tables); +extern void sqlp_enum_val(const char *val); extern void sqlp_start_col(void); extern void sqlp_stmt(void); extern void sqlp_table(const char *name); diff --git a/sql.y b/sql.y index 4cf7be4..92ea88d 100644 --- a/sql.y +++ b/sql.y @@ -735,18 +735,18 @@ create_definition: { sqlp_start_col(); } NAME data_type column_atts ; column_atts: /* nil */ { $$ = 0; } - | column_atts NOT NULLX { emit("ATTR NOTNULL"); $$ = $1 + 1; } + | column_atts NOT NULLX { sqlp_col_attr(SCA_NOTNULL); $$ = $1 + 1; } | column_atts NULLX - | column_atts DEFAULT STRING { emit("ATTR DEFAULT STRING %s", $3); free($3); $$ = $1 + 1; } - | column_atts DEFAULT INTNUM { emit("ATTR DEFAULT NUMBER %d", $3); $$ = $1 + 1; } - | column_atts DEFAULT APPROXNUM { emit("ATTR DEFAULT FLOAT %g", $3); $$ = $1 + 1; } - | column_atts DEFAULT BOOL { emit("ATTR DEFAULT BOOL %d", $3); $$ = $1 + 1; } - | column_atts AUTO_INCREMENT { emit("ATTR AUTOINC"); $$ = $1 + 1; } - | column_atts UNIQUE '(' column_list ')' { emit("ATTR UNIQUEKEY %d", $4); $$ = $1 + 1; } - | column_atts UNIQUE KEY { emit("ATTR UNIQUEKEY"); $$ = $1 + 1; } - | column_atts PRIMARY KEY { emit("ATTR PRIKEY"); $$ = $1 + 1; } - | column_atts KEY { emit("ATTR PRIKEY"); $$ = $1 + 1; } - | column_atts COMMENT STRING { emit("ATTR COMMENT %s", $3); free($3); $$ = $1 + 1; } + | column_atts DEFAULT STRING { sqlp_col_def_str($3); free($3); $$ = $1 + 1; } + | column_atts DEFAULT INTNUM { sqlp_col_def_num($3); $$ = $1 + 1; } + | column_atts DEFAULT APPROXNUM { sqlp_col_def_float($3); $$ = $1 + 1; } + | column_atts DEFAULT BOOL { sqlp_col_def_bool($3); $$ = $1 + 1; } + | column_atts AUTO_INCREMENT { sqlp_col_attr(SCA_AUTOINC); $$ = $1 + 1; } + | column_atts UNIQUE '(' column_list ')' { sqlp_col_attr_uniq($4); $$ = $1 + 1; } + | column_atts UNIQUE KEY { sqlp_col_attr_uniq(0); $$ = $1 + 1; } + | column_atts PRIMARY KEY { sqlp_col_attr(SCA_PRIMARY_KEY); $$ = $1 + 1; } + | column_atts KEY { sqlp_col_attr(SCA_PRIMARY_KEY); $$ = $1 + 1; } + | column_atts COMMENT STRING { sqlp_col_attr_comm($3); free($3); $$ = $1 + 1; } ; opt_length: /* nil */ { $$ = 0; } @@ -764,8 +764,8 @@ opt_uz: /* nil */ { $$ = 0; } ; opt_csc: /* nil */ - | opt_csc CHAR SET STRING { emit("COLCHARSET %s", $4); free($4); } - | opt_csc COLLATE STRING { emit("COLCOLLATE %s", $3); free($3); } + | opt_csc CHAR SET STRING { sqlp_col_charset($4); free($4); } + | opt_csc COLLATE STRING { sqlp_col_collate($3); free($3); } ; data_type: @@ -801,8 +801,8 @@ data_type: | SET '(' enum_list ')' opt_csc { $$ = 210000 + $3; } ; -enum_list: STRING { emit("ENUMVAL %s", $1); free($1); $$ = 1; } - | enum_list ',' STRING { emit("ENUMVAL %s", $3); free($3); $$ = $1 + 1; } +enum_list: STRING { sqlp_enum_val($1); free($1); $$ = 1; } + | enum_list ',' STRING { sqlp_enum_val($3); free($3); $$ = $1 + 1; } ; create_select_statement: opt_ignore_replace opt_as select_stmt { emit("CREATESELECT %d", $1) }