/* Copyright (C) 2014 InfiniDB, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include "calpontdmlpackage.h" #include "dmlpackage.h" #include "calpontdmlfactory.h" #include "vendordmlstatement.h" #include "insertdmlpackage.h" #include "deletedmlpackage.h" #include "updatedmlpackage.h" #include "commanddmlpackage.h" #include "messagequeue.h" #include "calpontdmlpackage.h" #include "dmlparser.h" using namespace std; using namespace dmlpackage; using namespace messageqcpp; bool parse_file(char* fileName) { DMLFileParser parser; parser.parse(fileName); bool good = parser.good(); if (good) { const ParseTree& ptree = parser.getParseTree(); cout << "Parser succeeded." << endl; cout << ptree.fList.size() << " " << "SQL statements" << endl; cout << ptree.fSqlText << endl; cout << ptree; SqlStatement* statementPtr = ptree[0]; if (statementPtr) cout << statementPtr->getQueryString(); cout << endl; } return good; } class DMLParserTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(DMLParserTest); CPPUNIT_TEST(test_i01); CPPUNIT_TEST(test_i02); CPPUNIT_TEST(test_i03); CPPUNIT_TEST(test_i04); CPPUNIT_TEST(test_u01); CPPUNIT_TEST(test_u02); CPPUNIT_TEST(test_d01); CPPUNIT_TEST(test_d02); CPPUNIT_TEST(test_d03); CPPUNIT_TEST(test_d04); CPPUNIT_TEST_SUITE_END(); private: public: void setUp() { } void tearDown() { } void test_i01() { CPPUNIT_ASSERT(parse_file("sql/i01.sql")); } void test_i02() { CPPUNIT_ASSERT(parse_file("sql/i02.sql")); } void test_i03() { CPPUNIT_ASSERT(parse_file("sql/i03.sql")); } void test_i04() { CPPUNIT_ASSERT(parse_file("sql/i04.sql")); } void test_u01() { CPPUNIT_ASSERT(parse_file("sql/u01.sql")); } void test_u02() { CPPUNIT_ASSERT(parse_file("sql/u02.sql")); } void test_d01() { CPPUNIT_ASSERT(parse_file("sql/d01.sql")); } void test_d02() { CPPUNIT_ASSERT(parse_file("sql/d02.sql")); } void test_d03() { CPPUNIT_ASSERT(parse_file("sql/d03.sql")); } void test_d04() { CPPUNIT_ASSERT(parse_file("sql/d04.sql")); } }; class DMLTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(DMLTest); // CPPUNIT_TEST( test_direct_insert ); // CPPUNIT_TEST( test_query_insert ); CPPUNIT_TEST(test_direct_update); // CPPUNIT_TEST( test_query_update ); // CPPUNIT_TEST( test_delete_all ); // CPPUNIT_TEST( test_delete_query ); // CPPUNIT_TEST( test_commit ); // CPPUNIT_TEST( test_rollback ); CPPUNIT_TEST_SUITE_END(); private: public: void setUp() { } void tearDown() { } void test_direct_insert() { ByteStream bytestream; std::string dmlStatement = "INSERT INTO tpch.supplier (supplier_id, supplier_name) VALUES(24553, 'IBM');"; cout << dmlStatement << endl; VendorDMLStatement dmlStmt(dmlStatement, 1); CalpontDMLPackage* pDMLPackage = CalpontDMLFactory::makeCalpontDMLPackage(dmlStmt); CPPUNIT_ASSERT(0 != pDMLPackage); write_DML_object(bytestream, pDMLPackage); delete pDMLPackage; read_insert_object(bytestream); } void test_query_insert() { ByteStream bytestream; std::string dmlStatement = "INSERT INTO supplier (supplier_id, supplier_name) SELECT account_no, name FROM customers WHERE city " "= 'Newark';"; cout << dmlStatement << endl; VendorDMLStatement dmlStmt(dmlStatement, 1); CalpontDMLPackage* pDMLPackage = CalpontDMLFactory::makeCalpontDMLPackage(dmlStmt); CPPUNIT_ASSERT(0 != pDMLPackage); if (pDMLPackage->HasFilter()) { cout << "This INSERT statement has a filter:" << endl; cout << pDMLPackage->get_QueryString() << endl; } write_DML_object(bytestream, pDMLPackage); delete pDMLPackage; read_insert_object(bytestream); } void write_DML_object(ByteStream& bs, CalpontDMLPackage* pDMLPackage) { pDMLPackage->write(bs); } void read_insert_object(ByteStream& bs) { ByteStream::byte package_type; bs >> package_type; CPPUNIT_ASSERT(DML_INSERT == package_type); InsertDMLPackage* pObject = new InsertDMLPackage(); pObject->read(bs); delete pObject; } void test_delete_all() { ByteStream bytestream; std::string dmlStatement = "DELETE FROM tpch.part;"; cout << dmlStatement << endl; VendorDMLStatement dmlStmt(dmlStatement, 1); CalpontDMLPackage* pDMLPackage = CalpontDMLFactory::makeCalpontDMLPackage(dmlStmt); CPPUNIT_ASSERT(0 != pDMLPackage); write_DML_object(bytestream, pDMLPackage); delete pDMLPackage; read_delete_object(bytestream); } void test_delete_query() { ByteStream bytestream; std::string dmlStatement = "DELETE FROM tpch.supplier WHERE supplier_name = 'IBM';"; cout << dmlStatement << endl; VendorDMLStatement dmlStmt(dmlStatement, 1); CalpontDMLPackage* pDMLPackage = CalpontDMLFactory::makeCalpontDMLPackage(dmlStmt); CPPUNIT_ASSERT(0 != pDMLPackage); if (pDMLPackage->HasFilter()) { cout << "This DELETE statement has a filter:" << endl; cout << pDMLPackage->get_QueryString() << endl; } write_DML_object(bytestream, pDMLPackage); delete pDMLPackage; read_delete_object(bytestream); } void read_delete_object(ByteStream& bs) { ByteStream::byte package_type; bs >> package_type; CPPUNIT_ASSERT(DML_DELETE == package_type); DeleteDMLPackage* pObject = new DeleteDMLPackage(); pObject->read(bs); delete pObject; } void test_direct_update() { ByteStream bytestream; std::string dmlStatement = "UPDATE tpch.part SET p_partno = 1, p_name = 'joe' where p_partno=2;"; cout << dmlStatement << endl; VendorDMLStatement dmlStmt(dmlStatement, 1); CalpontDMLPackage* pDMLPackage = CalpontDMLFactory::makeCalpontDMLPackage(dmlStmt); CPPUNIT_ASSERT(0 != pDMLPackage); write_DML_object(bytestream, pDMLPackage); delete pDMLPackage; read_update_object(bytestream); } void test_query_update() { ByteStream bytestream; std::string dmlStatement = "UPDATE tpch.supplier SET supplier_name='joe',supplier_state='ca' WHERE EXISTS ( SELECT " "customer.name FROM customers WHERE customers.customer_id = supplier.supplier_id);"; cout << dmlStatement << endl; VendorDMLStatement dmlStmt(dmlStatement, 1); CalpontDMLPackage* pDMLPackage = CalpontDMLFactory::makeCalpontDMLPackage(dmlStmt); CPPUNIT_ASSERT(0 != pDMLPackage); if (pDMLPackage->HasFilter()) { cout << "This UPDATE statement has a filter:" << endl; cout << pDMLPackage->get_QueryString() << endl; } write_DML_object(bytestream, pDMLPackage); delete pDMLPackage; read_update_object(bytestream); } void read_update_object(ByteStream& bs) { ByteStream::byte package_type; bs >> package_type; CPPUNIT_ASSERT(DML_UPDATE == package_type); UpdateDMLPackage* pObject = new UpdateDMLPackage(); pObject->read(bs); delete pObject; } void test_commit() { ByteStream bytestream; std::string dmlStatement = "COMMIT;"; cout << dmlStatement << endl; VendorDMLStatement dmlStmt(dmlStatement, 1); CalpontDMLPackage* pDMLPackage = CalpontDMLFactory::makeCalpontDMLPackage(dmlStmt); CPPUNIT_ASSERT(0 != pDMLPackage); write_DML_object(bytestream, pDMLPackage); delete pDMLPackage; read_command_object(bytestream); } void test_rollback() { ByteStream bytestream; std::string dmlStatement = "ROLLBACK;"; cout << dmlStatement << endl; VendorDMLStatement dmlStmt(dmlStatement, 1); CalpontDMLPackage* pDMLPackage = CalpontDMLFactory::makeCalpontDMLPackage(dmlStmt); CPPUNIT_ASSERT(0 != pDMLPackage); write_DML_object(bytestream, pDMLPackage); delete pDMLPackage; read_command_object(bytestream); } void read_command_object(ByteStream& bs) { ByteStream::byte package_type; bs >> package_type; CPPUNIT_ASSERT(DML_COMMAND == package_type); CommandDMLPackage* pObject = new CommandDMLPackage(); pObject->read(bs); delete pObject; } }; // CPPUNIT_TEST_SUITE_REGISTRATION( DMLParserTest ); CPPUNIT_TEST_SUITE_REGISTRATION(DMLTest); #include #include int main(int argc, char** argv) { CppUnit::TextUi::TestRunner runner; CppUnit::TestFactoryRegistry& registry = CppUnit::TestFactoryRegistry::getRegistry(); runner.addTest(registry.makeTest()); bool wasSuccessful = runner.run("", false); return (wasSuccessful ? 0 : 1); }