| 270 } |
270 } |
| 271 |
271 |
| 272 cxMempoolFree(mp); |
272 cxMempoolFree(mp); |
| 273 } |
273 } |
| 274 |
274 |
| |
275 CX_TEST_SUBROUTINE(verifyMultiTableResult, CxList *persons) { |
| |
276 CX_TEST_ASSERT(persons); |
| |
277 CX_TEST_ASSERT(cxListSize(persons) == 2); |
| |
278 |
| |
279 Person *p0 = cxListAt(persons, 0); |
| |
280 Person *p1 = cxListAt(persons, 1); |
| |
281 |
| |
282 CX_TEST_ASSERT(p0); |
| |
283 CX_TEST_ASSERT(p1); |
| |
284 CX_TEST_ASSERT(!cx_strcmp(p0->name, "alice")); |
| |
285 CX_TEST_ASSERT(!cx_strcmp(p1->name, "bob")); |
| |
286 CX_TEST_ASSERT(!cx_strcmp(p0->email, "alice@example.com")); |
| |
287 CX_TEST_ASSERT(!cx_strcmp(p1->email, "bob@example.com")); |
| |
288 CX_TEST_ASSERT(p0->age == 30); |
| |
289 CX_TEST_ASSERT(p1->age == 25); |
| |
290 CX_TEST_ASSERT(p0->iscustomer == 0); |
| |
291 CX_TEST_ASSERT(p1->iscustomer == 1); |
| |
292 CX_TEST_ASSERT(p0->hash == 123456789); |
| |
293 CX_TEST_ASSERT(p1->hash == 987654321); |
| |
294 |
| |
295 CX_TEST_ASSERT(p0->address != NULL); |
| |
296 CX_TEST_ASSERT(p1->address != NULL); |
| |
297 |
| |
298 CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1")); |
| |
299 CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2")); |
| |
300 CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343")); |
| |
301 CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456")); |
| |
302 CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17")); |
| |
303 CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18")); |
| |
304 } |
| |
305 |
| 275 CX_TEST(testMultiTableQuery) { |
306 CX_TEST(testMultiTableQuery) { |
| 276 CxMempool *mp = cxMempoolCreateSimple(64); |
307 CxMempool *mp = cxMempoolCreateSimple(64); |
| 277 |
308 |
| 278 CX_TEST_DO { |
309 CX_TEST_DO { |
| 279 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;"; |
310 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;"; |
| 280 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
311 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
| 281 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
312 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| 282 CxList *persons = dbuObjectBuilderGetList(builder); |
313 CxList *persons = dbuObjectBuilderGetList(builder); |
| 283 |
314 |
| 284 CX_TEST_ASSERT(persons); |
315 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons); |
| 285 CX_TEST_ASSERT(cxListSize(persons) == 2); |
|
| 286 |
|
| 287 Person *p0 = cxListAt(persons, 0); |
|
| 288 Person *p1 = cxListAt(persons, 1); |
|
| 289 CX_TEST_ASSERT(p0); |
|
| 290 CX_TEST_ASSERT(p1); |
|
| 291 CX_TEST_ASSERT(!cx_strcmp(p0->name, "alice")); |
|
| 292 CX_TEST_ASSERT(!cx_strcmp(p1->name, "bob")); |
|
| 293 CX_TEST_ASSERT(!cx_strcmp(p0->email, "alice@example.com")); |
|
| 294 CX_TEST_ASSERT(!cx_strcmp(p1->email, "bob@example.com")); |
|
| 295 CX_TEST_ASSERT(p0->age == 30); |
|
| 296 CX_TEST_ASSERT(p1->age == 25); |
|
| 297 CX_TEST_ASSERT(p0->iscustomer == 0); |
|
| 298 CX_TEST_ASSERT(p1->iscustomer == 1); |
|
| 299 CX_TEST_ASSERT(p0->hash == 123456789); |
|
| 300 CX_TEST_ASSERT(p1->hash == 987654321); |
|
| 301 |
|
| 302 CX_TEST_ASSERT(p0->address != NULL); |
|
| 303 CX_TEST_ASSERT(p1->address != NULL); |
|
| 304 |
|
| 305 CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1")); |
|
| 306 CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2")); |
|
| 307 CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343")); |
|
| 308 CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456")); |
|
| 309 CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17")); |
|
| 310 CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18")); |
|
| 311 |
316 |
| 312 dbuObjectBuilderDestroy(builder); |
317 dbuObjectBuilderDestroy(builder); |
| 313 } |
318 } |
| 314 |
319 |
| 315 cxMempoolFree(mp); |
320 cxMempoolFree(mp); |
| 322 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;"; |
327 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;"; |
| 323 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
328 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql1); |
| 324 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
329 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| 325 CxList *persons = dbuObjectBuilderGetList(builder); |
330 CxList *persons = dbuObjectBuilderGetList(builder); |
| 326 |
331 |
| 327 CX_TEST_ASSERT(persons); |
332 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons); |
| 328 CX_TEST_ASSERT(cxListSize(persons) == 2); |
333 |
| 329 |
334 dbuObjectBuilderDestroy(builder); |
| 330 Person *p0 = cxListAt(persons, 0); |
335 } |
| 331 Person *p1 = cxListAt(persons, 1); |
336 |
| 332 CX_TEST_ASSERT(p0); |
337 cxMempoolFree(mp); |
| 333 CX_TEST_ASSERT(p1); |
338 } |
| 334 CX_TEST_ASSERT(!cx_strcmp(p0->name, "alice")); |
339 |
| 335 CX_TEST_ASSERT(!cx_strcmp(p1->name, "bob")); |
340 CX_TEST_SUBROUTINE(verifyMultiTableResultCountry, CxList *persons) { |
| 336 CX_TEST_ASSERT(!cx_strcmp(p0->email, "alice@example.com")); |
341 Person *p0 = cxListAt(persons, 0); |
| 337 CX_TEST_ASSERT(!cx_strcmp(p1->email, "bob@example.com")); |
342 Person *p1 = cxListAt(persons, 1); |
| 338 CX_TEST_ASSERT(p0->age == 30); |
343 CX_TEST_ASSERT(p0 && p1); |
| 339 CX_TEST_ASSERT(p1->age == 25); |
344 |
| 340 CX_TEST_ASSERT(p0->iscustomer == 0); |
345 CX_TEST_ASSERT(p0->address->country); |
| 341 CX_TEST_ASSERT(p1->iscustomer == 1); |
346 CX_TEST_ASSERT(p1->address->country); |
| 342 CX_TEST_ASSERT(p0->hash == 123456789); |
347 CX_TEST_ASSERT(!cx_strcmp(p0->address->country->name, "Germany")); |
| 343 CX_TEST_ASSERT(p1->hash == 987654321); |
348 CX_TEST_ASSERT(!cx_strcmp(p1->address->country->name, "Germany")); |
| 344 |
|
| 345 CX_TEST_ASSERT(p0->address != NULL); |
|
| 346 CX_TEST_ASSERT(p1->address != NULL); |
|
| 347 |
|
| 348 CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1")); |
|
| 349 CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2")); |
|
| 350 CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343")); |
|
| 351 CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456")); |
|
| 352 CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17")); |
|
| 353 CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18")); |
|
| 354 |
|
| 355 dbuObjectBuilderDestroy(builder); |
|
| 356 } |
|
| 357 |
|
| 358 cxMempoolFree(mp); |
|
| 359 } |
349 } |
| 360 |
350 |
| 361 CX_TEST(testMultiTableQuery2) { |
351 CX_TEST(testMultiTableQuery2) { |
| 362 CxMempool *mp = cxMempoolCreateSimple(64); |
352 CxMempool *mp = cxMempoolCreateSimple(64); |
| 363 |
353 |
| 369 "order by p.person_id;"; |
359 "order by p.person_id;"; |
| 370 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2); |
360 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2); |
| 371 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
361 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| 372 CxList *persons = dbuObjectBuilderGetList(builder); |
362 CxList *persons = dbuObjectBuilderGetList(builder); |
| 373 |
363 |
| 374 CX_TEST_ASSERT(persons); |
364 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons); |
| 375 CX_TEST_ASSERT(cxListSize(persons) == 2); |
365 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons); |
| 376 |
366 |
| 377 Person *p0 = cxListAt(persons, 0); |
367 dbuObjectBuilderDestroy(builder); |
| 378 Person *p1 = cxListAt(persons, 1); |
368 } |
| 379 CX_TEST_ASSERT(p0); |
369 |
| 380 CX_TEST_ASSERT(p1); |
370 cxMempoolFree(mp); |
| 381 CX_TEST_ASSERT(!cx_strcmp(p0->name, "alice")); |
371 } |
| 382 CX_TEST_ASSERT(!cx_strcmp(p1->name, "bob")); |
372 |
| 383 CX_TEST_ASSERT(!cx_strcmp(p0->email, "alice@example.com")); |
373 CX_TEST(testMultiTableQueryUnknownResult1) { |
| 384 CX_TEST_ASSERT(!cx_strcmp(p1->email, "bob@example.com")); |
374 CxMempool *mp = cxMempoolCreateSimple(64); |
| 385 CX_TEST_ASSERT(p0->age == 30); |
375 |
| 386 CX_TEST_ASSERT(p1->age == 25); |
376 CX_TEST_DO { |
| 387 CX_TEST_ASSERT(p0->iscustomer == 0); |
377 const char *sql2 = "select p.*, 'unknown1' as unknown1, " |
| 388 CX_TEST_ASSERT(p1->iscustomer == 1); |
378 "a.address_id as [__address__address_id], a.street, 'unknown2' as unknown2, a.zip, 123 as unknown3, a.city, " |
| 389 CX_TEST_ASSERT(p0->hash == 123456789); |
379 "NULL as [__unknowntab], 456 as unknown_4, " |
| 390 CX_TEST_ASSERT(p1->hash == 987654321); |
380 "c.country_id as [__country__country_id], c.name " |
| 391 |
381 "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 " |
| 392 CX_TEST_ASSERT(p0->address != NULL); |
382 "order by p.person_id;"; |
| 393 CX_TEST_ASSERT(p1->address != NULL); |
383 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, sql2); |
| 394 |
384 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, mp->allocator); |
| 395 CX_TEST_ASSERT(!cx_strcmp(p0->address->street, "street 1")); |
385 CxList *persons = dbuObjectBuilderGetList(builder); |
| 396 CX_TEST_ASSERT(!cx_strcmp(p1->address->street, "street 2")); |
386 |
| 397 CX_TEST_ASSERT(!cx_strcmp(p0->address->zip, "12343")); |
387 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResult, persons); |
| 398 CX_TEST_ASSERT(!cx_strcmp(p1->address->zip, "23456")); |
388 CX_TEST_CALL_SUBROUTINE(verifyMultiTableResultCountry, persons); |
| 399 CX_TEST_ASSERT(!cx_strcmp(p0->address->city, "city 17")); |
389 |
| 400 CX_TEST_ASSERT(!cx_strcmp(p1->address->city, "city 18")); |
390 dbuObjectBuilderDestroy(builder); |
| 401 |
391 } |
| 402 CX_TEST_ASSERT(p0->address->country); |
392 |
| 403 CX_TEST_ASSERT(p1->address->country); |
393 cxMempoolFree(mp); |
| 404 CX_TEST_ASSERT(!cx_strcmp(p0->address->country->name, "Germany")); |
394 } |
| 405 CX_TEST_ASSERT(!cx_strcmp(p1->address->country->name, "Germany")); |
|
| 406 |
|
| 407 dbuObjectBuilderDestroy(builder); |
|
| 408 } |
|
| 409 |
|
| 410 cxMempoolFree(mp); |
|
| 411 } |
|