OleMussmann opened a new pull request, #1099:
URL: https://github.com/apache/arrow-adbc/pull/1099

   # Test and Implement Foreign Keys
   This feature relies on Composite Primary Keys, which are implemented, but 
had no tests. The missing tests are included in this PR as a separate commit. 
The pull request closes #936 .
   
   ## Discussion points
   
   - SQLite constraints are currently nameless, whereas the PostgreSQL 
constraints have generated names. Should it stay that way?
   - SQLite and PostgreSQL return their constraints in different orders. Is 
that by design?
   - Since the order of constraints can vary between DBs, the Foreign Key tests 
currently identify constraint columns by their number of column usages. Maybe 
there's a better solution to it?
   - `c/validation/adbc_validation.cc` lines [1252-1255] assume a certain order 
of the constraint column usages. Should we find an order-agnostic solution 
instead? It might be more verbose. It's currently:
   ```
   ForeignKeyColumnUsagesTest(child_constraint, 0, "adbc_fkey_parent_2_test",
                              "id_primary_col1");
   ForeignKeyColumnUsagesTest(child_constraint, 1, "adbc_fkey_parent_2_test",
                              "id_primary_col2");
   ```
   - `c/validation/adbc_validation.cc` lines [964,1115] assume a certain order 
of the constraint column names. It is currently:
   ```
   for (column_index = 0; column_index < number_of_columns; column_index++) {
     std::string_view constraint_column_name(
         constraint->constraint_column_names[column_index].data,
         constraint->constraint_column_names[column_index].size_bytes);
     ASSERT_EQ(constraint_column_name, columns[column_index]);
   }
   ```
   An order-agnostic, but less specific, approach to test this could be
   ```
   ASSERT_THAT(constraint_column_name,
               ::testing::AnyOf(::testing::Eq(parent_2_column_names[0]),
                                ::testing::Eq(parent_2_column_names[1])));
   ```
   
   ## Working tests for Composite Primary Keys
   
   The composite primary key tests fail correctly in the following ways.
   
   ### Number of table columns
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsPrimaryKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1046: Failure
   Expected equality of these values:
     composite_table->n_table_columns
       Which is: 9
     2
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsPrimaryKey (87 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsPrimaryKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1046: Failure
   Expected equality of these values:
     composite_table->n_table_columns
       Which is: 9
     2
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsPrimaryKey (0 ms)
   ```
   
   ### Table names
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsPrimaryKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1057: Failure
   Expected: (parent_2_column) != (nullptr), actual: NULL vs (nullptr)
   could not find column NOT_EXISTING on adbc_composite_pkey_test table
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsPrimaryKey (90 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsPrimaryKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1057: Failure
   Expected: (parent_2_column) != (nullptr), actual: NULL vs (nullptr)
   could not find column NOT_EXISTING on adbc_composite_pkey_test table
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsPrimaryKey (0 ms)
   ```
   
   ### Constraint column names
   This test gives less helpful output, but is aligned with the existing 
primary key tests.
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsPrimaryKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1064: Failure
   Expected equality of these values:
     constraint_column_name
       Which is: "id_primary_col1"
     parent_2_column_names[column_name_index]
       Which is: 0x55de7b
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsPrimaryKey (79 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsPrimaryKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1064: Failure
   Expected equality of these values:
     constraint_column_name
       Which is: "id_primary_col1"
     parent_2_column_names[column_name_index]
       Which is: 0x512e86
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsPrimaryKey (0 ms)
   ```
   
   ### Number of table constraints
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsPrimaryKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1068: Failure
   Expected equality of these values:
     composite_table->n_table_constraints
       Which is: 9
     1
   expected 1 constraint on adbc_pkey_test table, found: 9
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsPrimaryKey (87 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsPrimaryKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1068: Failure
   Expected equality of these values:
     composite_table->n_table_constraints
       Which is: 9
     1
   expected 1 constraint on adbc_pkey_test table, found: 9
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsPrimaryKey (0 ms)
   ```
   
   ### Constraint type
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsPrimaryKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1075: Failure
   Expected equality of these values:
     composite_constraint_type
       Which is: "UNKNOWN KEY"
     "PRIMARY KEY"
       Which is: 0x55dee9
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsPrimaryKey (87 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsPrimaryKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1075: Failure
   Expected equality of these values:
     composite_constraint_type
       Which is: "UNKNOWN KEY"
     "PRIMARY KEY"
       Which is: 0x512ef4
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsPrimaryKey (0 ms)
   ```
   
   ### Number of constraints
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsPrimaryKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1076: Failure
   Expected equality of these values:
     composite_constraint->n_column_names
       Which is: 9
     2
   expected constraint adbc_pkey_test_pkey to be applied to 2 columns, found: 9
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsPrimaryKey (79 ms)
   
   ```
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsPrimaryKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1076: Failure
   Expected equality of these values:
     composite_constraint->n_column_names
       Which is: 9
     2
   expected constraint adbc_pkey_test_pkey to be applied to 2 columns, found: 9
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsPrimaryKey (0 ms)
   ```
   
   
   ## Working tests for Foreign Keys
   
   The foreign key tests fail correctly in the following ways.
   
   ### Number of columns
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1229: Failure
   Expected equality of these values:
     child_table->n_table_columns
       Which is: 9
     3
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsForeignKey (103 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1229: Failure
   Expected equality of these values:
     child_table->n_table_columns
       Which is: 9
     3
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsForeignKey (0 ms)
   ```
   
   
   ### Table names
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1237: Failure
   Expected: (child_column) != (nullptr), actual: NULL vs (nullptr)
   could not find column NOT_EXISTING on adbc_fkey_child_test table
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsForeignKey (120 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1237: Failure
   Expected: (child_column) != (nullptr), actual: NULL vs (nullptr)
   could not find column NOT_EXISTING on adbc_fkey_child_test table
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsForeignKey (0 ms)
   ```
   
   ### Number of table constraints
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1244: Failure
   Expected equality of these values:
     child_table->n_table_constraints
       Which is: 9
     3
   expected 3 constraint on adbc_fkey_child_test table, found: 9
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsForeignKey (98 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1244: Failure
   Expected equality of these values:
     child_table->n_table_constraints
       Which is: 9
     3
   expected 3 constraint on adbc_fkey_child_test table, found: 9
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsForeignKey (0 ms)
   ```
   
   ### Constraint Type
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1095: Failure
   Expected equality of these values:
     constraint_type
       Which is: "UNKNOWN KEY"
     key_type
       Which is: "FOREIGN KEY"
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsForeignKey (130 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1095: Failure
   Expected equality of these values:
     constraint_type
       Which is: "UNKNOWN KEY"
     key_type
       Which is: "FOREIGN KEY"
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsForeignKey (0 ms)
   ```
   
   ### Constraint Column Names (less helpful, but aligned with primary key 
tests)
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1106: Failure
   Expected equality of these values:
     constraint_column_name
       Which is: "WRONG_NAME"
     columns[column_index]
       Which is: "id_child_col1"
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsForeignKey (97 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1106: Failure
   Expected equality of these values:
     constraint_column_name
       Which is: "WRONG_NAME"
     columns[column_index]
       Which is: "id_child_col1"
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsForeignKey (0 ms)
   ```
   
   ### Target table name
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1139: Failure
   Expected equality of these values:
     constraint_column_usage_fk_table
       Which is: "WRONG_NAME"
     fk_table_name
       Which is: "adbc_fkey_parent_2_test"
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsForeignKey (103 ms)
   ```
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1139: Failure
   Expected equality of these values:
     constraint_column_usage_fk_table
       Which is: "WRONG_NAME"
     fk_table_name
       Which is: "adbc_fkey_parent_2_test"
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsForeignKey (103 ms)
   ```
   
   ### Target column name
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1146: Failure
   Expected equality of these values:
     constraint_column_usage_fk_column_name
       Which is: "WRONG_NAME"
     fk_column_name
       Which is: "id_primary_col1"
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsForeignKey (99 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1146: Failure
   Expected equality of these values:
     constraint_column_usage_fk_column_name
       Which is: "WRONG_NAME"
     fk_column_name
       Which is: "id_primary_col1"
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsForeignKey (0 ms)
   ```
   
   ### Skipped a mandatory constraint test
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1293: Failure
   Value of: TestedConstraints.adbc_fkey_child_test_pkey
     Actual: false
   Expected: true
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsForeignKey (98 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1293: Failure
   Value of: TestedConstraints.adbc_fkey_child_test_pkey
     Actual: false
   Expected: true
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsForeignKey (0 ms)
   ```
   
   ### Number of Foreign Key columns
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1096: Failure
   Expected equality of these values:
     constraint->n_column_names
       Which is: 9
     2
   expected constraint FOREIGN KEY of adbc_fkey_child_test to be applied to 2 
column(s), found: 9
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsForeignKey (102 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1096: Failure
   Expected equality of these values:
     constraint->n_column_names
       Which is: 9
     1
   expected constraint PRIMARY KEY of adbc_fkey_child_test to be applied to 1 
column(s), found: 9
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsForeignKey (0 ms)
   ```
   
   ### Foreign Key catalog name
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1120: Failure
   Value of: constraint_column_usage_fk_catalog
   Expected: (is equal to "main") or (is equal to "postgres")
     Actual: "WRONG_NAME"
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsForeignKey (99 ms)
   ```
   
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1120: Failure
   Value of: constraint_column_usage_fk_catalog
   Expected: (is equal to "main") or (is equal to "postgres")
     Actual: "WRONG_NAME"
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsForeignKey (0 ms)
   ```
   
   ### Foreign Key DB schema name
   
   ```
   [ RUN      ] PostgresConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1131: Failure
   Value of: constraint_column_usage_fk_db_schema
   Expected: (is equal to "") or (is equal to "public")
     Actual: "WRONG_NAME"
   [  FAILED  ] PostgresConnectionTest.MetadataGetObjectsForeignKey (97 ms)
   ```
   ```
   [ RUN      ] SqliteConnectionTest.MetadataGetObjectsForeignKey
   /home/ole/code/arrow-adbc/c/validation/adbc_validation.cc:1131: Failure
   Value of: constraint_column_usage_fk_db_schema
   Expected: (is equal to "") or (is equal to "public")
     Actual: "WRONG_NAME"
   [  FAILED  ] SqliteConnectionTest.MetadataGetObjectsForeignKey (0 ms)
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to