test/database.c

changeset 40
0b6bc15d022e
parent 39
cefc18b7a9d1
equal deleted inserted replaced
39:cefc18b7a9d1 40:0b6bc15d022e
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 }

mercurial