diff options
| author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2017-02-11 19:32:10 -0500 |
|---|---|---|
| committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2017-02-11 19:32:10 -0500 |
| commit | ae021531438b24b490998694d7dcb44706bdd9b1 (patch) | |
| tree | 611a6925ed0447b0ca5e71ef16a51e2df90dfc6d | |
| parent | f625e90a0721483f7f44b94b9bb57cc9d59565e8 (diff) | |
| download | verbly-ae021531438b24b490998694d7dcb44706bdd9b1.tar.gz verbly-ae021531438b24b490998694d7dcb44706bdd9b1.tar.bz2 verbly-ae021531438b24b490998694d7dcb44706bdd9b1.zip | |
Fixed statement generation involving two CTEs for the same table
| -rw-r--r-- | lib/statement.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
| diff --git a/lib/statement.cpp b/lib/statement.cpp index b892cab..e84a402 100644 --- a/lib/statement.cpp +++ b/lib/statement.cpp | |||
| @@ -309,6 +309,11 @@ namespace verbly { | |||
| 309 | joinCondition &= (field::integerField(joinTableName.c_str(), clause.getField().getConditionColumn()) == clause.getField().getConditionValue()); | 309 | joinCondition &= (field::integerField(joinTableName.c_str(), clause.getField().getConditionColumn()) == clause.getField().getConditionValue()); |
| 310 | } | 310 | } |
| 311 | 311 | ||
| 312 | // Instantiate a CTE in case we need one. This is necessary because | ||
| 313 | // the nextWithId is propagated in the instantiation of the joinStmt | ||
| 314 | // below. | ||
| 315 | std::string withName = instantiateWith(joinTableName); | ||
| 316 | |||
| 312 | // Recursively parse the subquery, and therefore obtain an | 317 | // Recursively parse the subquery, and therefore obtain an |
| 313 | // instantiated table to join against, as well as any joins or CTEs | 318 | // instantiated table to join against, as well as any joins or CTEs |
| 314 | // that the subquery may require to function. | 319 | // that the subquery may require to function. |
| @@ -331,7 +336,6 @@ namespace verbly { | |||
| 331 | // will return zero results. Instead, we create a non-recursive | 336 | // will return zero results. Instead, we create a non-recursive |
| 332 | // CTE that represents the subquery, then LEFT JOIN against it and | 337 | // CTE that represents the subquery, then LEFT JOIN against it and |
| 333 | // condition on the join column being NULL as before. | 338 | // condition on the join column being NULL as before. |
| 334 | std::string withName = instantiateWith(joinTableName); | ||
| 335 | std::string withInstName = instantiateTable(withName); | 339 | std::string withInstName = instantiateTable(withName); |
| 336 | 340 | ||
| 337 | // LEFT JOIN against the CTE. | 341 | // LEFT JOIN against the CTE. |
| @@ -383,6 +387,11 @@ namespace verbly { | |||
| 383 | case field::type::join_through: | 387 | case field::type::join_through: |
| 384 | case field::type::join_through_where: | 388 | case field::type::join_through_where: |
| 385 | { | 389 | { |
| 390 | // Instantiate a CTE in case we need one. This is necessary because | ||
| 391 | // the nextWithId is propagated in the instantiation of the joinStmt | ||
| 392 | // below. | ||
| 393 | std::string withName = instantiateWith(clause.getField().getTable()); | ||
| 394 | |||
| 386 | // Recursively parse the subquery, and therefore obtain an | 395 | // Recursively parse the subquery, and therefore obtain an |
| 387 | // instantiated table to join against, as well as any joins or CTEs | 396 | // instantiated table to join against, as well as any joins or CTEs |
| 388 | // that the subquery may require to function. | 397 | // that the subquery may require to function. |
| @@ -406,7 +415,6 @@ namespace verbly { | |||
| 406 | // create a non-recursive CTE that represents the through table | 415 | // create a non-recursive CTE that represents the through table |
| 407 | // joined against the subquery, then LEFT JOIN against it and | 416 | // joined against the subquery, then LEFT JOIN against it and |
| 408 | // condition on the join column being NULL as before. | 417 | // condition on the join column being NULL as before. |
| 409 | std::string withName = instantiateWith(clause.getField().getTable()); | ||
| 410 | std::string withInstName = instantiateTable(withName); | 418 | std::string withInstName = instantiateTable(withName); |
| 411 | 419 | ||
| 412 | // LEFT JOIN against the CTE. | 420 | // LEFT JOIN against the CTE. |
