add test for queries with unknown columns

Thu, 01 Jan 2026 17:56:38 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 01 Jan 2026 17:56:38 +0100
changeset 37
81dfb9a43a38
parent 36
93753b036d9f
child 38
27fadadaae31

add test for queries with unknown columns

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	Wed Dec 31 15:41:51 2025 +0100
+++ b/test/database.c	Thu Jan 01 17:56:38 2026 +0100
@@ -272,6 +272,37 @@
     cxMempoolFree(mp);
 }
 
+CX_TEST_SUBROUTINE(verifyMultiTableResult, CxList *persons) {
+    CX_TEST_ASSERT(persons);
+    CX_TEST_ASSERT(cxListSize(persons) == 2);
+
+    Person *p0 = cxListAt(persons, 0);
+    Person *p1 = cxListAt(persons, 1);
+    
+    CX_TEST_ASSERT(p0);
+    CX_TEST_ASSERT(p1);
+    CX_TEST_ASSERT(!cx_strcmp(p0->name, "alice"));
+    CX_TEST_ASSERT(!cx_strcmp(p1->name, "bob"));
+    CX_TEST_ASSERT(!cx_strcmp(p0->email, "alice@example.com"));
+    CX_TEST_ASSERT(!cx_strcmp(p1->email, "bob@example.com"));
+    CX_TEST_ASSERT(p0->age == 30);
+    CX_TEST_ASSERT(p1->age == 25);
+    CX_TEST_ASSERT(p0->iscustomer == 0);
+    CX_TEST_ASSERT(p1->iscustomer == 1);
+    CX_TEST_ASSERT(p0->hash == 123456789);
+    CX_TEST_ASSERT(p1->hash == 987654321);
+
+    CX_TEST_ASSERT(p0->address != NULL);
+    CX_TEST_ASSERT(p1->address != NULL);
+
+    CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1"));
+    CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2"));
+    CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343"));
+    CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456"));
+    CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17"));
+    CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18"));
+}
+
 CX_TEST(testMultiTableQuery) {
     CxMempool *mp = cxMempoolCreateSimple(64);
     
@@ -281,33 +312,7 @@
         DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
         CxList *persons = dbuObjectBuilderGetList(builder);
         
-        CX_TEST_ASSERT(persons);
-        CX_TEST_ASSERT(cxListSize(persons) == 2);
-        
-        Person *p0 = cxListAt(persons, 0);
-        Person *p1 = cxListAt(persons, 1);
-        CX_TEST_ASSERT(p0);
-        CX_TEST_ASSERT(p1);
-        CX_TEST_ASSERT(!cx_strcmp(p0->name, "alice"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->name, "bob"));
-        CX_TEST_ASSERT(!cx_strcmp(p0->email, "alice@example.com"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->email, "bob@example.com"));
-        CX_TEST_ASSERT(p0->age == 30);
-        CX_TEST_ASSERT(p1->age == 25);
-        CX_TEST_ASSERT(p0->iscustomer == 0);
-        CX_TEST_ASSERT(p1->iscustomer == 1);
-        CX_TEST_ASSERT(p0->hash == 123456789);
-        CX_TEST_ASSERT(p1->hash == 987654321);
-        
-        CX_TEST_ASSERT(p0->address != NULL);
-        CX_TEST_ASSERT(p1->address != NULL);
-        
-        CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2"));
-        CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456"));
-        CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18"));
+        CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons);
         
         dbuObjectBuilderDestroy(builder);
     }
@@ -324,33 +329,7 @@
         DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
         CxList *persons = dbuObjectBuilderGetList(builder);
         
-        CX_TEST_ASSERT(persons);
-        CX_TEST_ASSERT(cxListSize(persons) == 2);
-        
-        Person *p0 = cxListAt(persons, 0);
-        Person *p1 = cxListAt(persons, 1);
-        CX_TEST_ASSERT(p0);
-        CX_TEST_ASSERT(p1);
-        CX_TEST_ASSERT(!cx_strcmp(p0->name, "alice"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->name, "bob"));
-        CX_TEST_ASSERT(!cx_strcmp(p0->email, "alice@example.com"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->email, "bob@example.com"));
-        CX_TEST_ASSERT(p0->age == 30);
-        CX_TEST_ASSERT(p1->age == 25);
-        CX_TEST_ASSERT(p0->iscustomer == 0);
-        CX_TEST_ASSERT(p1->iscustomer == 1);
-        CX_TEST_ASSERT(p0->hash == 123456789);
-        CX_TEST_ASSERT(p1->hash == 987654321);
-        
-        CX_TEST_ASSERT(p0->address != NULL);
-        CX_TEST_ASSERT(p1->address != NULL);
-        
-        CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2"));
-        CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456"));
-        CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18"));
+        CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons);
         
         dbuObjectBuilderDestroy(builder);
     }
@@ -358,6 +337,17 @@
     cxMempoolFree(mp);
 }
 
+CX_TEST_SUBROUTINE(verifyMultiTableResultCountry, CxList *persons) {
+    Person *p0 = cxListAt(persons, 0);
+    Person *p1 = cxListAt(persons, 1);
+    CX_TEST_ASSERT(p0 && p1);
+
+    CX_TEST_ASSERT(p0->address->country);
+    CX_TEST_ASSERT(p1->address->country);
+    CX_TEST_ASSERT(!cx_strcmp(p0->address->country->name, "Germany"));
+    CX_TEST_ASSERT(!cx_strcmp(p1->address->country->name, "Germany"));
+}
+
 CX_TEST(testMultiTableQuery2) {
     CxMempool *mp = cxMempoolCreateSimple(64);
     
@@ -371,41 +361,34 @@
         DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
         CxList *persons = dbuObjectBuilderGetList(builder);
         
-        CX_TEST_ASSERT(persons);
-        CX_TEST_ASSERT(cxListSize(persons) == 2);
-        
-        Person *p0 = cxListAt(persons, 0);
-        Person *p1 = cxListAt(persons, 1);
-        CX_TEST_ASSERT(p0);
-        CX_TEST_ASSERT(p1);
-        CX_TEST_ASSERT(!cx_strcmp(p0->name, "alice"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->name, "bob"));
-        CX_TEST_ASSERT(!cx_strcmp(p0->email, "alice@example.com"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->email, "bob@example.com"));
-        CX_TEST_ASSERT(p0->age == 30);
-        CX_TEST_ASSERT(p1->age == 25);
-        CX_TEST_ASSERT(p0->iscustomer == 0);
-        CX_TEST_ASSERT(p1->iscustomer == 1);
-        CX_TEST_ASSERT(p0->hash == 123456789);
-        CX_TEST_ASSERT(p1->hash == 987654321);
-        
-        CX_TEST_ASSERT(p0->address != NULL);
-        CX_TEST_ASSERT(p1->address != NULL);
-        
-        CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2"));
-        CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456"));
-        CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18"));
-        
-        CX_TEST_ASSERT(p0->address->country);
-        CX_TEST_ASSERT(p1->address->country);
-        CX_TEST_ASSERT(!cx_strcmp(p0->address->country->name, "Germany"));
-        CX_TEST_ASSERT(!cx_strcmp(p1->address->country->name, "Germany"));
+        CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons);
+        CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons);
         
         dbuObjectBuilderDestroy(builder);
     }
     
     cxMempoolFree(mp);
 }
+
+CX_TEST(testMultiTableQueryUnknownResult1) {
+    CxMempool *mp = cxMempoolCreateSimple(64);
+    
+    CX_TEST_DO {
+        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, "
+                           "c.country_id as [__country__country_id], c.name "
+                           "from Person p inner join Address a on p.address_id = a.address_id inner join Country c on a.country_id = c.country_id "
+                           "order by p.person_id;";
+        DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2);
+        DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator);
+        CxList *persons = dbuObjectBuilderGetList(builder);
+        
+        CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons);
+        CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons);
+        
+        dbuObjectBuilderDestroy(builder);
+    }
+    
+    cxMempoolFree(mp);
+}
\ No newline at end of file
--- a/test/database.h	Wed Dec 31 15:41:51 2025 +0100
+++ b/test/database.h	Thu Jan 01 17:56:38 2026 +0100
@@ -53,6 +53,7 @@
 CX_TEST(testMultiTableQuery);
 CX_TEST(testMultiTableQuery1);
 CX_TEST(testMultiTableQuery2);
+CX_TEST(testMultiTableQueryUnknownResult1);
 
 
 #ifdef __cplusplus
--- a/test/main.c	Wed Dec 31 15:41:51 2025 +0100
+++ b/test/main.c	Thu Jan 01 17:56:38 2026 +0100
@@ -136,6 +136,7 @@
     cx_test_register(suite, testMultiTableQuery);
     cx_test_register(suite, testMultiTableQuery1);
     cx_test_register(suite, testMultiTableQuery2);
+    cx_test_register(suite, testMultiTableQueryUnknownResult1);
 #endif
     cx_test_register(suite, testObjectToJsonSimple);
     cx_test_register(suite, testObjectToJsonChildObj);

mercurial