# HG changeset patch # User Olaf Wintermann # Date 1767286598 -3600 # Node ID 81dfb9a43a38dc469fec9aa7e853308117b5af53 # Parent 93753b036d9fdaaeffb27a881e587653072ff406 add test for queries with unknown columns diff -r 93753b036d9f -r 81dfb9a43a38 test/database.c --- 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 diff -r 93753b036d9f -r 81dfb9a43a38 test/database.h --- 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 diff -r 93753b036d9f -r 81dfb9a43a38 test/main.c --- 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);