@@ -74,7 +74,8 @@ struct sql3column {
7474 sql3conflict_clause notnull_conflictclause ; // not null conflit clause
7575 sql3string unique_constraint_name ; // unique constraint name (can be NULL)
7676 sql3conflict_clause unique_conflictclause ; // unique conflit clause
77- sql3checkconstraint check_constraint ; // check constraint
77+ size_t num_check_constraints ; // number of check constraints
78+ sql3checkconstraint * check_constraints ; // array of check constraints (can be NULL)
7879 sql3string default_constraint_name ; // default constraint name (can be NULL)
7980 sql3string default_expr ; // default expression (can be NULL)
8081 sql3string collate_constraint_name ; // collate constraint name (can be NULL)
@@ -963,9 +964,13 @@ static sql3error_code sql3parse_column_constraints (sql3state *state, sql3column
963964 } break ;
964965
965966 case TOK_CHECK : {
966- // TODO Support multiple
967- column -> check_constraint .name = constraint_name ;
968- column -> check_constraint .expr = sql3parse_expression (state );
967+ // add check constraint to check constraints array
968+ ++ column -> num_check_constraints ;
969+ column -> check_constraints = SQL3REALLOC (column -> check_constraints , sizeof (sql3checkconstraint ) * column -> num_check_constraints );
970+ if (!column -> check_constraints ) return SQL3ERROR_MEMORY ;
971+ sql3checkconstraint * ptr = & column -> check_constraints [column -> num_check_constraints - 1 ];
972+ ptr -> name = constraint_name ;
973+ ptr -> expr = sql3parse_expression (state );
969974 } break ;
970975
971976 case TOK_DEFAULT : {
@@ -1416,6 +1421,9 @@ void sql3table_free (sql3table *table) {
14161421 // free columns
14171422 for (size_t i = 0 ; i < table -> num_columns ; ++ i ) {
14181423 sql3column * column = table -> columns [i ];
1424+ if (column -> check_constraints ) {
1425+ SQL3FREE (column -> check_constraints );
1426+ }
14191427 if (column -> foreignkey_clause ) {
14201428 if (column -> foreignkey_clause -> column_name ) SQL3FREE (column -> foreignkey_clause -> column_name );
14211429 SQL3FREE (column -> foreignkey_clause );
@@ -1536,7 +1544,7 @@ bool sql3column_is_unique (sql3column *column) {
15361544 return column -> is_unique ;
15371545}
15381546
1539- sql3string * sql3column_pk_constraint_name (sql3column * column ) {
1547+ sql3string * sql3column_pk_constraint_name (sql3column * column ) {
15401548 CHECK_STR (column -> pk_constraint_name );
15411549 return & column -> pk_constraint_name ;
15421550}
@@ -1558,7 +1566,7 @@ sql3conflict_clause sql3column_notnull_conflictclause (sql3column *column) {
15581566 return column -> notnull_conflictclause ;
15591567}
15601568
1561- sql3string * sql3column_unique_constraint_name (sql3column * column ) {
1569+ sql3string * sql3column_unique_constraint_name (sql3column * column ) {
15621570 CHECK_STR (column -> unique_constraint_name );
15631571 return & column -> unique_constraint_name ;
15641572}
@@ -1567,17 +1575,24 @@ sql3conflict_clause sql3column_unique_conflictclause (sql3column *column) {
15671575 return column -> unique_conflictclause ;
15681576}
15691577
1570- sql3string * sql3column_check_constraint_name (sql3column * column ) {
1571- CHECK_STR (column -> check_constraint .name );
1572- return & column -> check_constraint .name ;
1578+ size_t sql3column_num_check_constraints (sql3column * column )
1579+ {
1580+ return column -> num_check_constraints ;
1581+ }
1582+
1583+ sql3string * sql3column_check_constraint_name (sql3column * column , size_t index ) {
1584+ CHECK_IDX (index , column -> num_check_constraints );
1585+ CHECK_STR (column -> check_constraints [index ].name );
1586+ return & (column -> check_constraints [index ].name );
15731587}
15741588
1575- sql3string * sql3column_check_expr (sql3column * column ) {
1576- CHECK_STR (column -> check_constraint .expr );
1577- return & column -> check_constraint .expr ;
1589+ sql3string * sql3column_check_expr (sql3column * column , size_t index ) {
1590+ CHECK_IDX (index , column -> num_check_constraints );
1591+ CHECK_STR (column -> check_constraints [index ].expr );
1592+ return & (column -> check_constraints [index ].expr );
15781593}
15791594
1580- sql3string * sql3column_default_constraint_name (sql3column * column ) {
1595+ sql3string * sql3column_default_constraint_name (sql3column * column ) {
15811596 CHECK_STR (column -> default_constraint_name );
15821597 return & column -> default_constraint_name ;
15831598}
@@ -1611,12 +1626,12 @@ sql3string *sql3column_generated_constraint_name (sql3column *column) {
16111626 return & column -> generated_constraint_name ;
16121627}
16131628
1614- sql3string * sql3column_generated_expr (sql3column * column ) {
1629+ sql3string * sql3column_generated_expr (sql3column * column ) {
16151630 CHECK_STR (column -> generated_expr );
16161631 return & column -> generated_expr ;
16171632}
16181633
1619- sql3gen_type sql3column_generated_type (sql3column * column ) {
1634+ sql3gen_type sql3column_generated_type (sql3column * column ) {
16201635 return column -> generated_type ;
16211636}
16221637
0 commit comments