| 309 |
309 |
| 310 CX_TEST(testMultiTableQuery) { |
310 CX_TEST(testMultiTableQuery) { |
| 311 CxMempool *mp = cxMempoolCreateSimple(64); |
311 CxMempool *mp = cxMempoolCreateSimple(64); |
| 312 |
312 |
| 313 CX_TEST_DO { |
313 CX_TEST_DO { |
| |
314 // select persons + addresses, a.address_id as __address__address_id (table separator) |
| 314 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;"; |
315 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;"; |
| 315 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
316 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
| 316 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
317 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| 317 CxList *persons = dbuObjectBuilderGetList(builder); |
318 CxList *persons = dbuObjectBuilderGetList(builder); |
| 318 |
319 |
| 326 |
327 |
| 327 CX_TEST(testMultiTableQuery1) { |
328 CX_TEST(testMultiTableQuery1) { |
| 328 CxMempool *mp = cxMempoolCreateSimple(64); |
329 CxMempool *mp = cxMempoolCreateSimple(64); |
| 329 |
330 |
| 330 CX_TEST_DO { |
331 CX_TEST_DO { |
| |
332 // select persons + addresses, NULL as __address (table seprator) |
| 331 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;"; |
333 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;"; |
| 332 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
334 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
| 333 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
335 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| 334 CxList *persons = dbuObjectBuilderGetList(builder); |
336 CxList *persons = dbuObjectBuilderGetList(builder); |
| 335 |
337 |
| 354 |
356 |
| 355 CX_TEST(testMultiTableQuery2) { |
357 CX_TEST(testMultiTableQuery2) { |
| 356 CxMempool *mp = cxMempoolCreateSimple(64); |
358 CxMempool *mp = cxMempoolCreateSimple(64); |
| 357 |
359 |
| 358 CX_TEST_DO { |
360 CX_TEST_DO { |
| |
361 // select persons, addresses and countries |
| 359 const char *sql2 = "select p.*, " |
362 const char *sql2 = "select p.*, " |
| 360 "a.address_id as [__address__address_id], a.street, a.zip, a.city, " |
363 "a.address_id as [__address__address_id], a.street, a.zip, a.city, " |
| 361 "c.country_id as [__country__country_id], c.name " |
364 "c.country_id as [__country__country_id], c.name " |
| 362 "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 " |
365 "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 " |
| 363 "order by p.person_id;"; |
366 "order by p.person_id;"; |
| 376 |
379 |
| 377 CX_TEST(testMultiTableQueryUnknownResult1) { |
380 CX_TEST(testMultiTableQueryUnknownResult1) { |
| 378 CxMempool *mp = cxMempoolCreateSimple(64); |
381 CxMempool *mp = cxMempoolCreateSimple(64); |
| 379 |
382 |
| 380 CX_TEST_DO { |
383 CX_TEST_DO { |
| |
384 // select persons, addresses and countries |
| 381 const char *sql2 = "select p.*, 'unknown1' as unknown1, " |
385 const char *sql2 = "select p.*, 'unknown1' as unknown1, " |
| 382 "a.address_id as [__address__address_id], a.street, 'unknown2' as unknown2, a.zip, 123 as unknown3, a.city, " |
386 "a.address_id as [__address__address_id], a.street, 'unknown2' as unknown2, a.zip, 123 as unknown3, a.city, " |
| 383 "NULL as [__unknowntab], 456 as unknown_4, " |
387 "NULL as [__unknowntab], 456 as unknown_4, " |
| 384 "c.country_id as [__country__country_id], c.name " |
388 "c.country_id as [__country__country_id], c.name " |
| 385 "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 " |
389 "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 " |
| 420 |
424 |
| 421 CX_TEST(testQuerySubListDense1) { |
425 CX_TEST(testQuerySubListDense1) { |
| 422 CxMempool *mp = cxMempoolCreateSimple(64); |
426 CxMempool *mp = cxMempoolCreateSimple(64); |
| 423 |
427 |
| 424 CX_TEST_DO { |
428 CX_TEST_DO { |
| |
429 // select persons + a list of roles per person |
| 425 const char *sql1 = |
430 const char *sql1 = |
| 426 "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;"; |
431 "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;"; |
| 427 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
432 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
| 428 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
433 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| 429 dbuObjectBuilderSetDenseResult(builder, true); |
434 dbuObjectBuilderSetDenseResult(builder, true); |
| 435 dbuObjectBuilderDestroy(builder); |
440 dbuObjectBuilderDestroy(builder); |
| 436 } |
441 } |
| 437 |
442 |
| 438 cxMempoolFree(mp); |
443 cxMempoolFree(mp); |
| 439 } |
444 } |
| |
445 |
| |
446 CX_TEST(testQuerySubListDenseWithMultiTable1) { |
| |
447 CxMempool *mp = cxMempoolCreateSimple(64); |
| |
448 |
| |
449 CX_TEST_DO { |
| |
450 const char *sql1 = |
| |
451 "select p.*, NULL as [__address], a.*, r.role_id as [__role__role_id], r.person_id, r.name " |
| |
452 "from Person p inner join Address a on p.address_id = a.address_id " |
| |
453 "inner join Role r on p.person_id = r.person_id order by p.person_id;"; |
| |
454 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
| |
455 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| |
456 dbuObjectBuilderSetDenseResult(builder, true); |
| |
457 CxList *persons = dbuObjectBuilderGetList(builder); |
| |
458 |
| |
459 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, true); // also verify address |
| |
460 CX_TEST_CALL_SUBROUTINE(verifyPersonRoles, persons); |
| |
461 |
| |
462 dbuObjectBuilderDestroy(builder); |
| |
463 } |
| |
464 |
| |
465 cxMempoolFree(mp); |
| |
466 } |
| |
467 |
| |
468 CX_TEST(testQuerySubListDenseWithMultiTable2) { |
| |
469 CxMempool *mp = cxMempoolCreateSimple(64); |
| |
470 |
| |
471 // Same as testQuerySubListDenseWithMultiTable1, but with a different column order |
| |
472 // person, role, address |
| |
473 |
| |
474 CX_TEST_DO { |
| |
475 const char *sql1 = |
| |
476 "select p.*, r.role_id as [__role__role_id], r.person_id, r.name, NULL as [__address], a.* " |
| |
477 "from Person p inner join Address a on p.address_id = a.address_id " |
| |
478 "inner join Role r on p.person_id = r.person_id order by p.person_id;"; |
| |
479 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
| |
480 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| |
481 dbuObjectBuilderSetDenseResult(builder, true); |
| |
482 CxList *persons = dbuObjectBuilderGetList(builder); |
| |
483 |
| |
484 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons, true); // also verify address |
| |
485 CX_TEST_CALL_SUBROUTINE(verifyPersonRoles, persons); |
| |
486 |
| |
487 dbuObjectBuilderDestroy(builder); |
| |
488 } |
| |
489 |
| |
490 cxMempoolFree(mp); |
| |
491 } |