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
16 changes: 12 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,22 +73,30 @@ sql3foreignkey *sql3table_constraint_foreignkey_clause (sql3tableconstraint
sql3string *sql3column_name (sql3column *column);
sql3string *sql3column_type (sql3column *column);
sql3string *sql3column_length (sql3column *column);
sql3string *sql3column_constraint_name (sql3column *column);
sql3string *sql3column_comment (sql3column *column);
bool sql3column_is_primarykey (sql3column *column);
bool sql3column_is_autoincrement (sql3column *column);
bool sql3column_is_notnull (sql3column *column);
bool sql3column_is_unique (sql3column *column);
sql3string *sql3column_pk_constraint_name (sql3column *column);
sql3order_clause sql3column_pk_order (sql3column *column);
sql3conflict_clause sql3column_pk_conflictclause (sql3column *column);
sql3string *sql3column_notnull_constraint_name (sql3column *column);
sql3conflict_clause sql3column_notnull_conflictclause (sql3column *column);
sql3string *sql3column_unique_constraint_name (sql3column *column);
sql3conflict_clause sql3column_unique_conflictclause (sql3column *column);
sql3string *sql3column_check_expr (sql3column *column);
size_t sql3column_num_check_constraints (sql3column *column);
sql3string *sql3column_check_constraint_name (sql3column *column, size_t index);
sql3string *sql3column_check_expr (sql3column *column, size_t index);
sql3string *sql3column_default_constraint_name (sql3column *column);
sql3string *sql3column_default_expr (sql3column *column);
sql3string *sql3column_collate_constraint_name (sql3column *column);
sql3string *sql3column_collate_name (sql3column *column);
sql3string *sql3column_foreignkey_constraint_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_constraint_name (sql3column *column);
sql3string *sql3column_generated_expr (sql3column *column);
sql3gen_type sql3column_generated_type (sql3column *column);

// Foreign key
sql3string *sql3foreignkey_table (sql3foreignkey *fk);
Expand Down
8 changes: 7 additions & 1 deletion debug/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,13 @@ int main (void) {
, test -- test 123\n\
INTEGER, UNIQUE (flags /* Hello World*/, test) -- This is another table comment\n\
);");
test_case("CREATE TABLE Sales(Price INT, Qty INT, Total INT GENERATED ALWAYS AS (Price*Qty) VIRTUAL, Item TEXT)");
test_case("CREATE TABLE Sales(Price INT, Qty INT, Total INT GENERATED ALWAYS AS (Price*Qty) VIRTUAL, Item TEXT);");
test_case("CREATE TABLE Constraints(\
PK INTEGER CONSTRAINT 'PrimaryKey' PRIMARY KEY CONSTRAINT 'NotNull' NOT NULL CONSTRAINT 'Unique' UNIQUE\
CONSTRAINT 'Check' CHECK (PK>0) CONSTRAINT 'Default' DEFAULT 2 CONSTRAINT 'Collate' COLLATE NOCASE,\
FK INTEGER CONSTRAINT 'ForeignKey' REFERENCES ForeignTable (Id),\
GEN INTEGER CONSTRAINT 'Generated' AS (abs(PK)));");
test_case("CREATE TABLE ColumnChecks(Num INT CONSTRAINT 'GT' CHECK (Num>0) CONSTRAINT 'LT' CHECK (Num<10) CONSTRAINT 'NE' CHECK(Num<>5));");

// https://www.sqlite.org/lang_altertable.html
test_case("ALTER TABLE foo RENAME TO bar");
Expand Down
82 changes: 59 additions & 23 deletions debug/sql3parse_debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,69 +117,105 @@ static void sql3column_dump (sql3column *column) {
// column name
sql3string *ptr = sql3column_name(column);
sql3string_dump(ptr, "Column Name");

// column type
ptr = sql3column_type(column);
sql3string_dump(ptr, "Column Type");

// column length
ptr = sql3column_length(column);
sql3string_dump(ptr, "Column Length");

// constraint name
ptr = sql3column_constraint_name(column);
sql3string_dump(ptr, "Constraint Name");


// column comment
ptr = sql3column_comment(column);
if (ptr) sql3string_dump(ptr, "Column Comment");

// flags
printf("Primary Key: %d\n", sql3column_is_primarykey(column));
printf("Autoincrement: %d\n", sql3column_is_autoincrement(column));
printf("Not NULL: %d\n", sql3column_is_notnull(column));
printf("Unique: %d\n", sql3column_is_unique(column));

// enums

// primary key constraint name
ptr = sql3column_pk_constraint_name(column);
sql3string_dump(ptr, "Primary Key Constraint Name");

// primary key order
sql3order_clause order = sql3column_pk_order(column);
if (order != SQL3ORDER_NONE)
printf("Primary Key Order: %s\n", (order == SQL3ORDER_ASC) ? "ASC" : "DESC");


// primary key conflict clause
sql3conflict_clause clause = sql3column_pk_conflictclause(column);
if (clause != SQL3CONFLICT_NONE)
printf("Primary Key Conflict Cause: %s\n", sql3conflict_clause_str(clause));


// not null constraint name
ptr = sql3column_notnull_constraint_name(column);
sql3string_dump(ptr, "Not NULL Constraint Name");

// not null conflict clause
clause = sql3column_notnull_conflictclause(column);
if (clause != SQL3CONFLICT_NONE)
printf("Not NULL Conflict Cause: %s\n", sql3conflict_clause_str(clause));


// unique constraint name
ptr = sql3column_unique_constraint_name(column);
sql3string_dump(ptr, "Unique Constraint Name");

// unique conflict clause
clause = sql3column_unique_conflictclause(column);
if (clause != SQL3CONFLICT_NONE)
printf("Unique Conflict Cause: %s\n", sql3conflict_clause_str(clause));

sql3gen_type gen_type = sql3column_generated_type(column);
if (gen_type != SQL3GENTYPE_NONE)
printf("Generated Type: %s\n", sql3generated_type_str(gen_type));

// check expr
ptr = sql3column_check_expr(column);
sql3string_dump(ptr, "Check Expression");

// check constraints
size_t num_check_constraints = sql3column_num_check_constraints(column);
for (size_t i = 0; i < num_check_constraints; ++i) {
// check constraint name
ptr = sql3column_check_constraint_name(column, i);
sql3string_dump(ptr, "Check Constraint Name");

// check expr
ptr = sql3column_check_expr(column, i);
sql3string_dump(ptr, "Check Expression");
}

// default constraint name
ptr = sql3column_default_constraint_name(column);
sql3string_dump(ptr, "Default Constraint Name");

// default expr
ptr = sql3column_default_expr(column);
sql3string_dump(ptr, "Default Expression");


// collate constraint name
ptr = sql3column_collate_constraint_name(column);
sql3string_dump(ptr, "Collate Constraint Name");

// collate name
ptr = sql3column_collate_name(column);
sql3string_dump(ptr, "Collate");


// foreign key constraint name
ptr = sql3column_foreignkey_constraint_name(column);
sql3string_dump(ptr, "Foreign Key Constraint Name");

// foreign key
sql3foreignkey *fk = sql3column_foreignkey_clause(column);
sql3foreignkey_dump(fk);

// generated constraint name
ptr = sql3column_generated_constraint_name(column);
sql3string_dump(ptr, "Generated Constraint Name");

// generated expr
ptr = sql3column_generated_expr(column);
sql3string_dump(ptr, "Generated Expression");

// generated type
sql3gen_type gen_type = sql3column_generated_type(column);
if (gen_type != SQL3GENTYPE_NONE)
printf("Generated Type: %s\n", sql3generated_type_str(gen_type));
}

static void sql3tableconstraint_dump (sql3tableconstraint *constraint) {
Expand Down
Loading