summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2017-02-11 19:32:10 -0500
committerKelly Rauchenberger <fefferburbia@gmail.com>2017-02-11 19:32:10 -0500
commitae021531438b24b490998694d7dcb44706bdd9b1 (patch)
tree611a6925ed0447b0ca5e71ef16a51e2df90dfc6d
parentf625e90a0721483f7f44b94b9bb57cc9d59565e8 (diff)
downloadverbly-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.cpp12
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.