Skip to content

Commit afce5fa

Browse files
authored
Merge pull request #11 from stephnol/feature/Support-Multiple-Check-Constraints
Feature/support multiple column check constraints
2 parents 4ae7652 + fe62c6c commit afce5fa

5 files changed

Lines changed: 211 additions & 82 deletions

File tree

README.md

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,22 +73,30 @@ sql3foreignkey *sql3table_constraint_foreignkey_clause (sql3tableconstraint
7373
sql3string *sql3column_name (sql3column *column);
7474
sql3string *sql3column_type (sql3column *column);
7575
sql3string *sql3column_length (sql3column *column);
76-
sql3string *sql3column_constraint_name (sql3column *column);
7776
sql3string *sql3column_comment (sql3column *column);
7877
bool sql3column_is_primarykey (sql3column *column);
7978
bool sql3column_is_autoincrement (sql3column *column);
8079
bool sql3column_is_notnull (sql3column *column);
8180
bool sql3column_is_unique (sql3column *column);
81+
sql3string *sql3column_pk_constraint_name (sql3column *column);
8282
sql3order_clause sql3column_pk_order (sql3column *column);
8383
sql3conflict_clause sql3column_pk_conflictclause (sql3column *column);
84+
sql3string *sql3column_notnull_constraint_name (sql3column *column);
8485
sql3conflict_clause sql3column_notnull_conflictclause (sql3column *column);
86+
sql3string *sql3column_unique_constraint_name (sql3column *column);
8587
sql3conflict_clause sql3column_unique_conflictclause (sql3column *column);
86-
sql3string *sql3column_check_expr (sql3column *column);
88+
size_t sql3column_num_check_constraints (sql3column *column);
89+
sql3string *sql3column_check_constraint_name (sql3column *column, size_t index);
90+
sql3string *sql3column_check_expr (sql3column *column, size_t index);
91+
sql3string *sql3column_default_constraint_name (sql3column *column);
8792
sql3string *sql3column_default_expr (sql3column *column);
93+
sql3string *sql3column_collate_constraint_name (sql3column *column);
8894
sql3string *sql3column_collate_name (sql3column *column);
95+
sql3string *sql3column_foreignkey_constraint_name (sql3column *column);
8996
sql3foreignkey *sql3column_foreignkey_clause (sql3column *column);
90-
sql3string *sql3column_generated_expr (sql3column* column);
91-
sql3gen_type sql3column_generated_type (sql3column* column);
97+
sql3string *sql3column_generated_constraint_name (sql3column *column);
98+
sql3string *sql3column_generated_expr (sql3column *column);
99+
sql3gen_type sql3column_generated_type (sql3column *column);
92100
93101
// Foreign key
94102
sql3string *sql3foreignkey_table (sql3foreignkey *fk);

debug/main.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,13 @@ int main (void) {
5555
, test -- test 123\n\
5656
INTEGER, UNIQUE (flags /* Hello World*/, test) -- This is another table comment\n\
5757
);");
58-
test_case("CREATE TABLE Sales(Price INT, Qty INT, Total INT GENERATED ALWAYS AS (Price*Qty) VIRTUAL, Item TEXT)");
58+
test_case("CREATE TABLE Sales(Price INT, Qty INT, Total INT GENERATED ALWAYS AS (Price*Qty) VIRTUAL, Item TEXT);");
59+
test_case("CREATE TABLE Constraints(\
60+
PK INTEGER CONSTRAINT 'PrimaryKey' PRIMARY KEY CONSTRAINT 'NotNull' NOT NULL CONSTRAINT 'Unique' UNIQUE\
61+
CONSTRAINT 'Check' CHECK (PK>0) CONSTRAINT 'Default' DEFAULT 2 CONSTRAINT 'Collate' COLLATE NOCASE,\
62+
FK INTEGER CONSTRAINT 'ForeignKey' REFERENCES ForeignTable (Id),\
63+
GEN INTEGER CONSTRAINT 'Generated' AS (abs(PK)));");
64+
test_case("CREATE TABLE ColumnChecks(Num INT CONSTRAINT 'GT' CHECK (Num>0) CONSTRAINT 'LT' CHECK (Num<10) CONSTRAINT 'NE' CHECK(Num<>5));");
5965

6066
// https://www.sqlite.org/lang_altertable.html
6167
test_case("ALTER TABLE foo RENAME TO bar");

debug/sql3parse_debug.c

Lines changed: 59 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -117,69 +117,105 @@ static void sql3column_dump (sql3column *column) {
117117
// column name
118118
sql3string *ptr = sql3column_name(column);
119119
sql3string_dump(ptr, "Column Name");
120-
120+
121121
// column type
122122
ptr = sql3column_type(column);
123123
sql3string_dump(ptr, "Column Type");
124-
124+
125125
// column length
126126
ptr = sql3column_length(column);
127127
sql3string_dump(ptr, "Column Length");
128-
129-
// constraint name
130-
ptr = sql3column_constraint_name(column);
131-
sql3string_dump(ptr, "Constraint Name");
132-
128+
133129
// column comment
134130
ptr = sql3column_comment(column);
135131
if (ptr) sql3string_dump(ptr, "Column Comment");
136-
132+
137133
// flags
138134
printf("Primary Key: %d\n", sql3column_is_primarykey(column));
139135
printf("Autoincrement: %d\n", sql3column_is_autoincrement(column));
140136
printf("Not NULL: %d\n", sql3column_is_notnull(column));
141137
printf("Unique: %d\n", sql3column_is_unique(column));
142-
143-
// enums
138+
139+
// primary key constraint name
140+
ptr = sql3column_pk_constraint_name(column);
141+
sql3string_dump(ptr, "Primary Key Constraint Name");
142+
143+
// primary key order
144144
sql3order_clause order = sql3column_pk_order(column);
145145
if (order != SQL3ORDER_NONE)
146146
printf("Primary Key Order: %s\n", (order == SQL3ORDER_ASC) ? "ASC" : "DESC");
147-
147+
148+
// primary key conflict clause
148149
sql3conflict_clause clause = sql3column_pk_conflictclause(column);
149150
if (clause != SQL3CONFLICT_NONE)
150151
printf("Primary Key Conflict Cause: %s\n", sql3conflict_clause_str(clause));
151-
152+
153+
// not null constraint name
154+
ptr = sql3column_notnull_constraint_name(column);
155+
sql3string_dump(ptr, "Not NULL Constraint Name");
156+
157+
// not null conflict clause
152158
clause = sql3column_notnull_conflictclause(column);
153159
if (clause != SQL3CONFLICT_NONE)
154160
printf("Not NULL Conflict Cause: %s\n", sql3conflict_clause_str(clause));
155-
161+
162+
// unique constraint name
163+
ptr = sql3column_unique_constraint_name(column);
164+
sql3string_dump(ptr, "Unique Constraint Name");
165+
166+
// unique conflict clause
156167
clause = sql3column_unique_conflictclause(column);
157168
if (clause != SQL3CONFLICT_NONE)
158169
printf("Unique Conflict Cause: %s\n", sql3conflict_clause_str(clause));
159170

160-
sql3gen_type gen_type = sql3column_generated_type(column);
161-
if (gen_type != SQL3GENTYPE_NONE)
162-
printf("Generated Type: %s\n", sql3generated_type_str(gen_type));
163-
164-
// check expr
165-
ptr = sql3column_check_expr(column);
166-
sql3string_dump(ptr, "Check Expression");
167-
171+
// check constraints
172+
size_t num_check_constraints = sql3column_num_check_constraints(column);
173+
for (size_t i = 0; i < num_check_constraints; ++i) {
174+
// check constraint name
175+
ptr = sql3column_check_constraint_name(column, i);
176+
sql3string_dump(ptr, "Check Constraint Name");
177+
178+
// check expr
179+
ptr = sql3column_check_expr(column, i);
180+
sql3string_dump(ptr, "Check Expression");
181+
}
182+
183+
// default constraint name
184+
ptr = sql3column_default_constraint_name(column);
185+
sql3string_dump(ptr, "Default Constraint Name");
186+
168187
// default expr
169188
ptr = sql3column_default_expr(column);
170189
sql3string_dump(ptr, "Default Expression");
171-
190+
191+
// collate constraint name
192+
ptr = sql3column_collate_constraint_name(column);
193+
sql3string_dump(ptr, "Collate Constraint Name");
194+
172195
// collate name
173196
ptr = sql3column_collate_name(column);
174197
sql3string_dump(ptr, "Collate");
175-
198+
199+
// foreign key constraint name
200+
ptr = sql3column_foreignkey_constraint_name(column);
201+
sql3string_dump(ptr, "Foreign Key Constraint Name");
202+
176203
// foreign key
177204
sql3foreignkey *fk = sql3column_foreignkey_clause(column);
178205
sql3foreignkey_dump(fk);
179206

207+
// generated constraint name
208+
ptr = sql3column_generated_constraint_name(column);
209+
sql3string_dump(ptr, "Generated Constraint Name");
210+
180211
// generated expr
181212
ptr = sql3column_generated_expr(column);
182213
sql3string_dump(ptr, "Generated Expression");
214+
215+
// generated type
216+
sql3gen_type gen_type = sql3column_generated_type(column);
217+
if (gen_type != SQL3GENTYPE_NONE)
218+
printf("Generated Type: %s\n", sql3generated_type_str(gen_type));
183219
}
184220

185221
static void sql3tableconstraint_dump (sql3tableconstraint *constraint) {

0 commit comments

Comments
 (0)