Begin replacing emit() placeholders with API function calls
CREATE DATABASE, DROP DATABASE, DROP TABLE, sql statement, and list of table names all have associated API calls. Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
4
Makefile
4
Makefile
@ -15,9 +15,9 @@ all: ${PROGRAMS}
|
||||
|
||||
# chapter 4
|
||||
|
||||
OBJS = sql.tab.o sql.o
|
||||
OBJS = sql.tab.o sql.o exec.o
|
||||
|
||||
sql: ${OBJS}
|
||||
sql: ${OBJS} sql-parser.h
|
||||
${CC} -o $@ ${OBJS}
|
||||
|
||||
sql.tab.c sql.tab.h: sql.y
|
||||
|
31
exec.c
Normal file
31
exec.c
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include "sql-parser.h"
|
||||
|
||||
void sqlp_create_db(int if_ne, const char *name)
|
||||
{
|
||||
printf("exec CREATE-DB %d %s\n", if_ne, name);
|
||||
}
|
||||
|
||||
void sqlp_drop_db(int if_exists, const char *name)
|
||||
{
|
||||
printf("exec DROP-DB %d %s\n", if_exists, name);
|
||||
}
|
||||
|
||||
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_stmt(void)
|
||||
{
|
||||
printf("exec STMT\n");
|
||||
}
|
||||
|
||||
void sqlp_table(const char *name)
|
||||
{
|
||||
printf("exec TABLE %s\n", name);
|
||||
}
|
||||
|
10
sql-parser.h
Normal file
10
sql-parser.h
Normal file
@ -0,0 +1,10 @@
|
||||
#ifndef __SQL_PARSER_H__
|
||||
#define __SQL_PARSER_H__
|
||||
|
||||
extern void sqlp_create_db(int if_n_exists, 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_stmt(void);
|
||||
extern void sqlp_table(const char *name);
|
||||
|
||||
#endif /* __SQL_PARSER_H__ */
|
39
sql.y
39
sql.y
@ -11,6 +11,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include "sql-parser.h"
|
||||
|
||||
%}
|
||||
|
||||
@ -347,7 +348,7 @@ stmt_list: error ';'
|
||||
|
||||
/* statements: select statement */
|
||||
|
||||
stmt: select_stmt { emit("STMT"); }
|
||||
stmt: select_stmt { sqlp_stmt(); }
|
||||
;
|
||||
|
||||
select_stmt: SELECT select_opts select_expr_list
|
||||
@ -506,7 +507,7 @@ table_subquery: '(' select_stmt ')' { emit("SUBQUERY"); }
|
||||
|
||||
/* statements: delete statement */
|
||||
|
||||
stmt: delete_stmt { emit("STMT"); }
|
||||
stmt: delete_stmt { sqlp_stmt(); }
|
||||
;
|
||||
|
||||
delete_stmt: DELETE delete_opts FROM NAME
|
||||
@ -540,7 +541,7 @@ delete_stmt: DELETE delete_opts
|
||||
|
||||
/* statements: insert statement */
|
||||
|
||||
stmt: insert_stmt { emit("STMT"); }
|
||||
stmt: insert_stmt { sqlp_stmt(); }
|
||||
;
|
||||
|
||||
insert_stmt: INSERT insert_opts opt_into NAME
|
||||
@ -604,7 +605,7 @@ insert_asgn_list:
|
||||
;
|
||||
|
||||
/** replace just like insert **/
|
||||
stmt: replace_stmt { emit("STMT"); }
|
||||
stmt: replace_stmt { sqlp_stmt(); }
|
||||
;
|
||||
|
||||
replace_stmt: REPLACE insert_opts opt_into NAME
|
||||
@ -625,7 +626,7 @@ replace_stmt: REPLACE insert_opts opt_into NAME opt_col_names
|
||||
;
|
||||
|
||||
/** update **/
|
||||
stmt: update_stmt { emit("STMT"); }
|
||||
stmt: update_stmt { sqlp_stmt(); }
|
||||
;
|
||||
|
||||
update_stmt: UPDATE update_opts table_references
|
||||
@ -658,12 +659,12 @@ update_asgn_list:
|
||||
|
||||
/** create database **/
|
||||
|
||||
stmt: create_database_stmt { emit("STMT"); }
|
||||
stmt: create_database_stmt { sqlp_stmt(); }
|
||||
;
|
||||
|
||||
create_database_stmt:
|
||||
CREATE DATABASE opt_if_not_exists NAME { emit("CREATEDATABASE %d %s", $3, $4); free($4); }
|
||||
| CREATE SCHEMA opt_if_not_exists NAME { emit("CREATEDATABASE %d %s", $3, $4); free($4); }
|
||||
CREATE DATABASE opt_if_not_exists NAME { sqlp_create_db($3, $4); free($4); }
|
||||
| CREATE SCHEMA opt_if_not_exists NAME { sqlp_create_db($3, $4); free($4); }
|
||||
;
|
||||
|
||||
opt_if_not_exists: /* nil */ { $$ = 0; }
|
||||
@ -673,12 +674,12 @@ opt_if_not_exists: /* nil */ { $$ = 0; }
|
||||
|
||||
/** drop database **/
|
||||
|
||||
stmt: drop_database_stmt { emit("STMT"); }
|
||||
stmt: drop_database_stmt { sqlp_stmt(); }
|
||||
;
|
||||
|
||||
drop_database_stmt:
|
||||
DROP DATABASE opt_if_exists NAME { emit("DROPDATABASE %d %s", $3, $4); free($4); }
|
||||
| DROP SCHEMA opt_if_exists NAME { emit("DROPDATABASE %d %s", $3, $4); free($4); }
|
||||
DROP DATABASE opt_if_exists NAME { sqlp_drop_db($3, $4); free($4); }
|
||||
| DROP SCHEMA opt_if_exists NAME { sqlp_drop_db($3, $4); free($4); }
|
||||
;
|
||||
|
||||
opt_if_exists: /* nil */ { $$ = 0; }
|
||||
@ -687,7 +688,7 @@ opt_if_exists: /* nil */ { $$ = 0; }
|
||||
|
||||
|
||||
/** create table **/
|
||||
stmt: create_table_stmt { emit("STMT"); }
|
||||
stmt: create_table_stmt { sqlp_stmt(); }
|
||||
;
|
||||
|
||||
create_table_stmt: CREATE opt_temporary TABLE opt_if_not_exists NAME
|
||||
@ -818,24 +819,24 @@ opt_temporary: /* nil */ { $$ = 0; }
|
||||
|
||||
/** drop table **/
|
||||
|
||||
stmt: drop_table_stmt { emit("STMT"); }
|
||||
stmt: drop_table_stmt { sqlp_stmt(); }
|
||||
;
|
||||
|
||||
drop_table_stmt:
|
||||
DROP opt_temporary TABLE opt_if_exists table_list { emit("DROPDATABASE %d %d %d", $2, $4, $5); }
|
||||
DROP opt_temporary TABLE opt_if_exists table_list { sqlp_drop_table($2, $4, $5); }
|
||||
;
|
||||
|
||||
table_list: NAME { emit("TABLE %s", $1); free($1); $$ = 1; }
|
||||
table_list: NAME { sqlp_table($1); free($1); $$ = 1; }
|
||||
| STRING { lyyerror(@1, "string %s found where name required", $1);
|
||||
emit("TABLE %s", $1); free($1); $$ = 1; }
|
||||
| table_list ',' NAME { emit("TABLE %s", $3); free($3); $$ = $1 + 1; }
|
||||
sqlp_table($1); free($1); $$ = 1; }
|
||||
| table_list ',' NAME { sqlp_table($3); free($3); $$ = $1 + 1; }
|
||||
| table_list ',' STRING { lyyerror(@3, "string %s found where name required", $1);
|
||||
emit("TABLE %s", $3); free($3); $$ = $1 + 1; }
|
||||
sqlp_table($3); free($3); $$ = $1 + 1; }
|
||||
;
|
||||
|
||||
/**** set user variables ****/
|
||||
|
||||
stmt: set_stmt { emit("STMT"); }
|
||||
stmt: set_stmt { sqlp_stmt(); }
|
||||
;
|
||||
|
||||
set_stmt: SET set_list ;
|
||||
|
Reference in New Issue
Block a user