add tests for selecting multible tables + list

Sat, 03 Jan 2026 17:21:52 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 03 Jan 2026 17:21:52 +0100
changeset 40
0b6bc15d022e
parent 39
cefc18b7a9d1
child 41
daabc9bb5445

add tests for selecting multible tables + list

test/database.c file | annotate | diff | comparison | revisions
test/database.h file | annotate | diff | comparison | revisions
test/main.c file | annotate | diff | comparison | revisions
--- a/test/database.c	Fri Jan 02 15:36:13 2026 +0100
+++ b/test/database.c	Sat Jan 03 17:21:52 2026 +0100
@@ -311,6 +311,7 @@
     CxMempool *mp = cxMempoolCreateSimple(64);
     
     CX_TEST_DO {
+        // select persons + addresses, a.address_id as __address__address_id (table separator) 
         const char *sql1 = "select p.*, a.address_id as [__address__address_id], a.street, a.zip, a.city from Person p inner join Address a on p.address_id = a.address_id order by p.person_id;";
         DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1);
         DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
@@ -328,6 +329,7 @@
     CxMempool *mp = cxMempoolCreateSimple(64);
     
     CX_TEST_DO {
+        // select persons + addresses, NULL as __address (table seprator)
         const char *sql1 = "select p.*, NULL as [__address], a.* from Person p inner join Address a on p.address_id = a.address_id order by p.person_id;";
         DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1);
         DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
@@ -356,6 +358,7 @@
     CxMempool *mp = cxMempoolCreateSimple(64);
     
     CX_TEST_DO {
+        // select persons, addresses and countries
         const char *sql2 = "select p.*, "
                            "a.address_id as [__address__address_id], a.street, a.zip, a.city, "
                            "c.country_id as [__country__country_id], c.name "
@@ -378,6 +381,7 @@
     CxMempool *mp = cxMempoolCreateSimple(64);
     
     CX_TEST_DO {
+        // select persons, addresses and countries
         const char *sql2 = "select p.*, 'unknown1' as unknown1, "
                            "a.address_id as [__address__address_id], a.street, 'unknown2' as unknown2, a.zip, 123 as unknown3, a.city, "
                            "NULL as [__unknowntab], 456 as unknown_4, "
@@ -422,6 +426,7 @@
     CxMempool *mp = cxMempoolCreateSimple(64);
     
     CX_TEST_DO {
+        // select persons + a list of roles per person
         const char *sql1 = 
             "select p.*, r.role_id as [__role__role_id], r.person_id, r.name from Person p inner join Role r on p.person_id = r.person_id order by p.person_id;";
         DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1);
@@ -437,3 +442,50 @@
     
     cxMempoolFree(mp);
 }
+
+CX_TEST(testQuerySubListDenseWithMultiTable1) {
+    CxMempool *mp = cxMempoolCreateSimple(64);
+    
+    CX_TEST_DO {
+        const char *sql1 = 
+            "select p.*, NULL as [__address], a.*, r.role_id as [__role__role_id], r.person_id, r.name "
+            "from Person p inner join Address a on p.address_id = a.address_id "
+            "inner join Role r on p.person_id = r.person_id order by p.person_id;";
+        DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1);
+        DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
+        dbuObjectBuilderSetDenseResult(builder, true);
+        CxList *persons = dbuObjectBuilderGetList(builder);
+        
+        CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, true); // also verify address
+        CX_TEST_CALL_SUBROUTINE(verifyPersonRoles, persons);
+        
+        dbuObjectBuilderDestroy(builder);
+    }
+    
+    cxMempoolFree(mp);
+}
+
+CX_TEST(testQuerySubListDenseWithMultiTable2) {
+    CxMempool *mp = cxMempoolCreateSimple(64);
+    
+    // Same as testQuerySubListDenseWithMultiTable1, but with a different column order
+    // person, role, address
+    
+    CX_TEST_DO {
+        const char *sql1 = 
+            "select p.*, r.role_id as [__role__role_id], r.person_id, r.name, NULL as [__address], a.* "
+            "from Person p inner join Address a on p.address_id = a.address_id "
+            "inner join Role r on p.person_id = r.person_id order by p.person_id;";
+        DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1);
+        DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
+        dbuObjectBuilderSetDenseResult(builder, true);
+        CxList *persons = dbuObjectBuilderGetList(builder);
+        
+        CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, true); // also verify address
+        CX_TEST_CALL_SUBROUTINE(verifyPersonRoles, persons);
+        
+        dbuObjectBuilderDestroy(builder);
+    }
+    
+    cxMempoolFree(mp);
+}
--- a/test/database.h	Fri Jan 02 15:36:13 2026 +0100
+++ b/test/database.h	Sat Jan 03 17:21:52 2026 +0100
@@ -55,7 +55,8 @@
 CX_TEST(testMultiTableQuery2);
 CX_TEST(testMultiTableQueryUnknownResult1);
 CX_TEST(testQuerySubListDense1);
-
+CX_TEST(testQuerySubListDenseWithMultiTable1);
+CX_TEST(testQuerySubListDenseWithMultiTable2);
 
 #ifdef __cplusplus
 }
--- a/test/main.c	Fri Jan 02 15:36:13 2026 +0100
+++ b/test/main.c	Sat Jan 03 17:21:52 2026 +0100
@@ -138,6 +138,8 @@
     cx_test_register(suite, testMultiTableQuery2);
     cx_test_register(suite, testMultiTableQueryUnknownResult1);
     cx_test_register(suite, testQuerySubListDense1);
+    cx_test_register(suite, testQuerySubListDenseWithMultiTable1);
+    cx_test_register(suite, testQuerySubListDenseWithMultiTable2);
 #endif
     cx_test_register(suite, testObjectToJsonSimple);
     cx_test_register(suite, testObjectToJsonChildObj);

mercurial