Feature #2576 ยป 0001-Dbo-test-for-left-join-uninitialized-value-fix.patch
src/Wt/Dbo/Session_impl.h | ||
---|---|---|
* If not, then we need to first read the object, get the id, and if
|
||
* we already had it, delete the redundant copy.
|
||
*/
|
||
long long id;
|
||
long long id = -1L;
|
||
/* Auto-generated surrogate key is first field */
|
||
/*
|
||
* Auto-generated surrogate key is first field
|
||
*
|
||
* NOTE: getResult will return false if the id field is NULL. This
|
||
* could occur with a LEFT JOIN involving the table. See: dbo_test4c.
|
||
* In this case, the id will default to -1 and get associated with a
|
||
* single null record in the mapping->registry_.
|
||
*/
|
||
statement->getResult(column++, &id);
|
||
typename Mapping<C>::Registry::iterator i = mapping->registry_.find(id);
|
test/dbo/DboTest.C | ||
---|---|---|
}
|
||
}
|
||
BOOST_AUTO_TEST_CASE( dbo_test4c )
|
||
{
|
||
DboFixture f;
|
||
dbo::Session *session_ = f.session_;
|
||
{
|
||
dbo::Transaction t(*session_);
|
||
dbo::ptr<A> a1(new A());
|
||
dbo::ptr<A> a2(new A());
|
||
dbo::ptr<A> a3(new A());
|
||
dbo::ptr<A> a4(new A());
|
||
dbo::ptr<B> b1(new B());
|
||
dbo::ptr<B> b2(new B());
|
||
dbo::ptr<C> c1(new C());
|
||
dbo::ptr<C> c2(new C());
|
||
a1.modify()->wstring = "a1";
|
||
a2.modify()->wstring = "a2";
|
||
a3.modify()->wstring = "a3";
|
||
a4.modify()->wstring = "a4";
|
||
b1.modify()->name = "b1";
|
||
b2.modify()->name = "b2";
|
||
c1.modify()->name = "c1";
|
||
c2.modify()->name = "c2";
|
||
a1.modify()->b = b1;
|
||
a1.modify()->c = c1;
|
||
// a2 has no c
|
||
a2.modify()->b = b2;
|
||
// a3 has no b
|
||
a3.modify()->c = c2;
|
||
// a4 has no b or c
|
||
session_->add(b1);
|
||
session_->add(b2);
|
||
session_->add(c1);
|
||
session_->add(c2);
|
||
session_->add(a1);
|
||
session_->add(a2);
|
||
session_->add(a3);
|
||
session_->add(a4);
|
||
}
|
||
{
|
||
dbo::Transaction t(*session_);
|
||
typedef dbo::ptr_tuple<A, B, C>::type ABC;
|
||
typedef dbo::collection<ABC> C_ABCs;
|
||
typedef std::vector<ABC> ABCs;
|
||
#if !defined(FIREBIRD) && !defined(MYSQL)
|
||
dbo::Query<ABC> q = session_->query<ABC>
|
||
("select A, B, C "
|
||
"from \"table_a\" A "
|
||
"left join \"table_b\" as B on A.\"b_id\" = B.\"id\" "
|
||
"left join \"table_c\" as C on A.\"table_c_id\" = C.\"id\"")
|
||
.orderBy("A.\"wstring\"");
|
||
C_ABCs c_abcs = q.resultList();
|
||
ABCs abcs(c_abcs.begin(), c_abcs.end());
|
||
BOOST_REQUIRE(abcs.size() == 4);
|
||
int ii = 0;
|
||
for (ABCs::const_iterator i = abcs.begin(); i != abcs.end(); ++i) {
|
||
dbo::ptr<A> a_result;
|
||
dbo::ptr<B> b_result;
|
||
dbo::ptr<C> c_result;
|
||
boost::tie(a_result, b_result, c_result) = *i;
|
||
switch (ii)
|
||
{
|
||
case 0:
|
||
BOOST_REQUIRE(a_result->wstring == "a1");
|
||
BOOST_REQUIRE(b_result->name == "b1");
|
||
BOOST_REQUIRE(c_result->name == "c1");
|
||
break;
|
||
case 1:
|
||
BOOST_REQUIRE(a_result->wstring == "a2");
|
||
BOOST_REQUIRE(b_result->name == "b2");
|
||
BOOST_REQUIRE(!a_result->c);
|
||
break;
|
||
case 2:
|
||
BOOST_REQUIRE(a_result->wstring == "a3");
|
||
BOOST_REQUIRE(!a_result->b);
|
||
BOOST_REQUIRE(c_result->name == "c2");
|
||
break;
|
||
case 3:
|
||
BOOST_REQUIRE(a_result->wstring == "a4");
|
||
BOOST_REQUIRE(!a_result->b);
|
||
BOOST_REQUIRE(!a_result->c);
|
||
break;
|
||
}
|
||
++ii;
|
||
}
|
||
BOOST_REQUIRE(ii == 4);
|
||
#endif //FIREBIRD && MYSQL
|
||
}
|
||
}
|
||
BOOST_AUTO_TEST_CASE( dbo_test5 )
|
||
{
|
||
DboFixture f;
|