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 /lib | |
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
Diffstat (limited to 'lib')
-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. |