Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ sql3string *sql3table_new_name (sql3table *table);
// Table constraints
sql3string *sql3table_constraint_name (sql3tableconstraint *tconstraint);
sql3constraint_type sql3table_constraint_type (sql3tableconstraint *tconstraint);
bool sql3table_constraint_is_autoincrement (sql3tableconstraint* tconstraint);
size_t sql3table_constraint_num_idxcolumns (sql3tableconstraint *tconstraint);
sql3idxcolumn *sql3table_constraint_get_idxcolumn (sql3tableconstraint *tconstraint, size_t index);
sql3conflict_clause sql3table_constraint_conflict_clause (sql3tableconstraint *tconstraint);
Expand Down
1 change: 1 addition & 0 deletions debug/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ int main (void) {
test_case("CREATE TABLE ct (d INT DEFAULT ( (1+2) ), e TEXT DEFAULT '))')");

test_case("CREATE TABLE foo (col1 INTEGER PRIMARY KEY AUTOINCREMENT, col2 TEXT, col3 TEXT);");
test_case("CREATE TABLE tcpkai (col INTEGER, PRIMARY KEY (col AUTOINCREMENT));");
test_case("CREATE TABLE t1(x INTEGER PRIMARY KEY, y);");
test_case("create table employee(first varchar(15),last varchar(20),age number(3),address varchar(30),city varchar(20),state varchar(20));");
test_case("CREATE TEMP TABLE IF NOT EXISTS main.foo /* This is the main table */ (col1 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, col2 TEXT DEFAULT CURRENT_TIMESTAMP, col3 FLOAT(8.12), col4 BLOB COLLATE BINARY /* Use this column for storing pictures */, CONSTRAINT tbl1 UNIQUE (col1 COLLATE c1 ASC, col2 COLLATE c2 DESC)) WITHOUT ROWID; -- this is a line comment");
Expand Down
5 changes: 5 additions & 0 deletions debug/sql3parse_debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,11 @@ static void sql3tableconstraint_dump (sql3tableconstraint *constraint) {
sql3string *ptr = sql3table_constraint_name(constraint);
sql3string_dump(ptr, "Constraint Name");

if (type == SQL3TABLECONSTRAINT_PRIMARYKEY) {
// autoincrement flag
printf("Autoincrement: %d\n", sql3table_constraint_is_autoincrement(constraint));
}

if ((type == SQL3TABLECONSTRAINT_PRIMARYKEY) || (type == SQL3TABLECONSTRAINT_UNIQUE)) {
// indexed columns
size_t num_idx = sql3table_constraint_num_idxcolumns(constraint);
Expand Down
18 changes: 16 additions & 2 deletions sql3parse_table.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ struct sql3tableconstraint {
size_t num_indexed; // number of indexed columns
sql3idxcolumn *indexed_columns; // array fo indexed columns
sql3conflict_clause conflict_clause; // conflict clause
bool is_autoincrement; // autoincrement flag (only for for SQL3TABLECONSTRAINT_PRIMARYKEY and num_indexed == 1)
};

// if type SQL3TABLECONSTRAINT_CHECK
Expand Down Expand Up @@ -767,9 +768,17 @@ static sql3tableconstraint *sql3parse_table_constraint (sql3state *state) {
constraint->indexed_columns[constraint->num_indexed-1] = column;

token = sql3lexer_peek(state);
if (token == TOK_AUTOINCREMENT) {
sql3lexer_next(state); // consume TOK_AUTOINCREMENT
if (constraint->type != SQL3TABLECONSTRAINT_PRIMARYKEY) goto error;
constraint->is_autoincrement = true;
token = sql3lexer_peek(state);
}
if (token == TOK_COMMA) sql3lexer_next(state); // consume TOK_COMMA

} while (token == TOK_COMMA);

if (constraint->is_autoincrement && (constraint->num_indexed != 1)) goto error;

if (sql3lexer_next(state) != TOK_CLOSED_PARENTHESIS) goto error;
if (sql3parse_optionalconflitclause(state, &constraint->conflict_clause) != SQL3ERROR_NONE) goto error;
Expand Down Expand Up @@ -1424,6 +1433,11 @@ sql3constraint_type sql3table_constraint_type (sql3tableconstraint *tconstraint)
return tconstraint->type;
}

bool sql3table_constraint_is_autoincrement (sql3tableconstraint* tconstraint) {
if (tconstraint->type != SQL3TABLECONSTRAINT_PRIMARYKEY) return false;
return tconstraint->is_autoincrement;
}

size_t sql3table_constraint_num_idxcolumns (sql3tableconstraint *tconstraint) {
if ((tconstraint->type != SQL3TABLECONSTRAINT_PRIMARYKEY) && (tconstraint->type != SQL3TABLECONSTRAINT_UNIQUE)) return 0;
return tconstraint->num_indexed;
Expand Down Expand Up @@ -1541,12 +1555,12 @@ sql3foreignkey *sql3column_foreignkey_clause (sql3column *column) {
return column->foreignkey_clause;
}

sql3string* sql3column_generated_expr(sql3column* column) {
sql3string* sql3column_generated_expr (sql3column* column) {
CHECK_STR(column->generated_expr);
return &column->generated_expr;
}

sql3gen_type sql3column_generated_type(sql3column* column) {
sql3gen_type sql3column_generated_type (sql3column* column) {
return column->generated_type;
}

Expand Down
5 changes: 3 additions & 2 deletions sql3parse_table.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ sql3string *sql3table_new_name (sql3table *table);
// Table Constraint
sql3string *sql3table_constraint_name (sql3tableconstraint *tconstraint);
sql3constraint_type sql3table_constraint_type (sql3tableconstraint *tconstraint);
bool sql3table_constraint_is_autoincrement (sql3tableconstraint* tconstraint);
size_t sql3table_constraint_num_idxcolumns (sql3tableconstraint *tconstraint);
sql3idxcolumn *sql3table_constraint_get_idxcolumn (sql3tableconstraint *tconstraint, size_t index);
sql3conflict_clause sql3table_constraint_conflict_clause (sql3tableconstraint *tconstraint);
Expand All @@ -153,8 +154,8 @@ sql3string *sql3column_check_expr (sql3column *column);
sql3string *sql3column_default_expr (sql3column *column);
sql3string *sql3column_collate_name (sql3column *column);
sql3foreignkey *sql3column_foreignkey_clause (sql3column *column);
sql3string* sql3column_generated_expr(sql3column* column);
sql3gen_type sql3column_generated_type(sql3column* column);
sql3string* sql3column_generated_expr (sql3column* column);
sql3gen_type sql3column_generated_type (sql3column* column);

// Foreign Key
sql3string *sql3foreignkey_table (sql3foreignkey *fk);
Expand Down