emit() sweep: convert CREATE TABLE column definition/attribs/constraints

Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
Jeff Garzik 2009-11-08 21:16:50 -05:00 committed by Jeff Garzik
parent 8948cfcb31
commit 5f11c7e1e0
3 changed files with 100 additions and 16 deletions

64
exec.c
View File

@ -4,6 +4,63 @@
#include <unistd.h>
#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");

View File

@ -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);

30
sql.y
View File

@ -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) }