You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-10-31 18:30:33 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			925 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			925 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* 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. */
 | |
| 
 | |
| /***************************************************************************
 | |
|  *   dhill@srvengcm1.calpont.com
 | |
|  *
 | |
|  *   Purpose: dll package tester
 | |
|  *
 | |
|  ***************************************************************************/
 | |
| 
 | |
| #include <string>
 | |
| #include <algorithm>
 | |
| #include <functional>
 | |
| #include <sstream>
 | |
| #include <exception>
 | |
| #include <iostream>
 | |
| #include <fstream>
 | |
| #include <unistd.h>
 | |
| #include <vector>
 | |
| #include <memory>
 | |
| 
 | |
| #include <cppunit/extensions/HelperMacros.h>
 | |
| 
 | |
| #include "sqlparser.h"
 | |
| #include "messagequeue.h"
 | |
| 
 | |
| using namespace std;
 | |
| using namespace ddlpackage;
 | |
| using namespace messageqcpp;
 | |
| 
 | |
| std::string itoa(const int i);
 | |
| 
 | |
| bool parse_file(char* fileName)
 | |
| {
 | |
|   SqlFileParser parser;
 | |
|   parser.Parse(fileName);
 | |
|   return parser.Good();
 | |
| }
 | |
| 
 | |
| class ParserTest : public CppUnit::TestFixture
 | |
| {
 | |
|   CPPUNIT_TEST_SUITE(ParserTest);
 | |
|   CPPUNIT_TEST(atac01);
 | |
|   CPPUNIT_TEST(atac05);
 | |
|   CPPUNIT_TEST(atac09);
 | |
|   CPPUNIT_TEST(atmcdd01);
 | |
|   CPPUNIT_TEST(atrt01);
 | |
|   CPPUNIT_TEST(ct02);
 | |
|   CPPUNIT_TEST(ct06);
 | |
|   CPPUNIT_TEST(ct10);
 | |
|   CPPUNIT_TEST(dt02);
 | |
|   CPPUNIT_TEST(atac02);
 | |
|   CPPUNIT_TEST(atac06);
 | |
|   CPPUNIT_TEST(atatc01);
 | |
|   CPPUNIT_TEST(atmcsd01);
 | |
|   CPPUNIT_TEST(ci01);
 | |
|   CPPUNIT_TEST(ct03);
 | |
|   CPPUNIT_TEST(ct07);
 | |
|   CPPUNIT_TEST(ct11);
 | |
|   CPPUNIT_TEST(empty_stmt);
 | |
|   CPPUNIT_TEST(atac03);
 | |
|   CPPUNIT_TEST(atac07);
 | |
|   CPPUNIT_TEST(atdc01);
 | |
|   CPPUNIT_TEST(atdc02);
 | |
|   CPPUNIT_TEST(atdc03);
 | |
|   CPPUNIT_TEST(atmct01);
 | |
|   CPPUNIT_TEST(atmct02);
 | |
|   CPPUNIT_TEST(comment);
 | |
|   CPPUNIT_TEST(ct04);
 | |
|   CPPUNIT_TEST(ct08);
 | |
|   CPPUNIT_TEST(di01);
 | |
|   CPPUNIT_TEST(atac04);
 | |
|   CPPUNIT_TEST(atac08);
 | |
|   CPPUNIT_TEST(atdtc01);
 | |
|   CPPUNIT_TEST(atdtc02);
 | |
|   CPPUNIT_TEST(atrc01);
 | |
|   CPPUNIT_TEST(ct01);
 | |
|   CPPUNIT_TEST(ct05);
 | |
|   CPPUNIT_TEST(ct09);
 | |
|   CPPUNIT_TEST(dt01);
 | |
|   CPPUNIT_TEST(foo);
 | |
| 
 | |
|   CPPUNIT_TEST_SUITE_END();
 | |
| 
 | |
|  private:
 | |
|  public:
 | |
|   void setUp()
 | |
|   {
 | |
|   }
 | |
|   void tearDown()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   void foo()
 | |
|   {
 | |
|     SqlParser p;
 | |
|     p.Parse("drop table foo");
 | |
|     cout << p.GetParseTree();
 | |
|   }
 | |
| 
 | |
|   void atac01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atac01.sql"));
 | |
|   }
 | |
|   void atac05()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atac05.sql"));
 | |
|   }
 | |
|   void atac09()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atac09.sql"));
 | |
|   }
 | |
|   void atmcdd01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atmcdd01.sql"));
 | |
|   }
 | |
|   void atrt01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atrt01.sql"));
 | |
|   }
 | |
|   void ct02()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/ct02.sql"));
 | |
|   }
 | |
|   void ct06()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/ct06.sql"));
 | |
|   }
 | |
|   void ct10()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/ct10.sql"));
 | |
|   }
 | |
|   void dt02()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/dt02.sql"));
 | |
|   }
 | |
|   void atac02()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atac02.sql"));
 | |
|   }
 | |
|   void atac06()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atac06.sql"));
 | |
|   }
 | |
|   void atatc01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atatc01.sql"));
 | |
|   }
 | |
|   void atmcsd01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atmcsd01.sql"));
 | |
|   }
 | |
|   void ci01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/ci01.sql"));
 | |
|   }
 | |
|   void ct03()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/ct03.sql"));
 | |
|   }
 | |
|   void ct07()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/ct07.sql"));
 | |
|   }
 | |
|   void ct11()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/ct11.sql"));
 | |
|   }
 | |
|   void empty_stmt()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/empty-stmt.sql"));
 | |
|   }
 | |
|   void atac03()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atac03.sql"));
 | |
|   }
 | |
|   void atac07()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atac07.sql"));
 | |
|   }
 | |
|   void atdc01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atdc01.sql"));
 | |
|   }
 | |
|   void atdc02()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atdc02.sql"));
 | |
|   }
 | |
|   void atdc03()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atdc03.sql"));
 | |
|   }
 | |
|   void atmct01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atmct01.sql"));
 | |
|   }
 | |
|   void atmct02()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atmct02.sql"));
 | |
|   }
 | |
|   void comment()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/comment.sql"));
 | |
|   }
 | |
|   void ct04()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/ct04.sql"));
 | |
|   }
 | |
|   void ct08()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/ct08.sql"));
 | |
|   }
 | |
|   void di01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/di01.sql"));
 | |
|   }
 | |
|   void atac04()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atac04.sql"));
 | |
|   }
 | |
|   void atac08()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atac08.sql"));
 | |
|   }
 | |
|   void atdtc01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atdtc01.sql"));
 | |
|   }
 | |
|   void atdtc02()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atdtc02.sql"));
 | |
|   }
 | |
|   void atrc01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/atrc01.sql"));
 | |
|   }
 | |
|   void ct01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/ct01.sql"));
 | |
|   }
 | |
|   void ct05()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/ct05.sql"));
 | |
|   }
 | |
|   void ct09()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/ct09.sql"));
 | |
|   }
 | |
|   void dt01()
 | |
|   {
 | |
|     CPPUNIT_ASSERT(parse_file("sql/dt01.sql"));
 | |
|   }
 | |
| };
 | |
| 
 | |
| template <class T>
 | |
| void u_sertest(T* x)
 | |
| {
 | |
|   ByteStream bs;
 | |
|   stringstream s1, s2;
 | |
|   auto_ptr<T> y(new T);
 | |
| 
 | |
|   x->serialize(bs);
 | |
|   y->unserialize(bs);
 | |
| 
 | |
|   s1 << *x;
 | |
|   s2 << *y;
 | |
| 
 | |
|   cout << "String Compare" << endl;
 | |
|   cout << "------------------" << endl;
 | |
|   cout << s1.str() << endl << s2.str() << endl;
 | |
|   cout << "------------------" << endl;
 | |
| 
 | |
|   CPPUNIT_ASSERT(s1.str() == s2.str());
 | |
| }
 | |
| 
 | |
| /** @brief Just like u_sertest except that a typecode is pulled off
 | |
|         the ByteStream before the unserialize. */
 | |
| template <class T>
 | |
| void t_sertest(T* x)
 | |
| {
 | |
|   ByteStream bs;
 | |
|   stringstream s1, s2;
 | |
|   auto_ptr<T> y(new T);
 | |
| 
 | |
|   x->serialize(bs);
 | |
| 
 | |
|   quadbyte type;
 | |
|   bs >> type;
 | |
| 
 | |
|   y->unserialize(bs);
 | |
| 
 | |
|   s1 << *x;
 | |
|   s2 << *y;
 | |
| 
 | |
|   cout << "String Compare" << endl;
 | |
|   cout << "------------------" << endl;
 | |
|   cout << s1.str() << endl << s2.str() << endl;
 | |
|   cout << "------------------" << endl;
 | |
| 
 | |
|   CPPUNIT_ASSERT(s1.str() == s2.str());
 | |
| }
 | |
| 
 | |
| class SerializeTest : public CppUnit::TestFixture
 | |
| {
 | |
|   CPPUNIT_TEST_SUITE(SerializeTest);
 | |
|   CPPUNIT_TEST(qname);
 | |
|   CPPUNIT_TEST(columntype);
 | |
|   CPPUNIT_TEST(columndefaultvalue);
 | |
|   CPPUNIT_TEST(columnconstraintdef);
 | |
|   CPPUNIT_TEST(columndef_01);
 | |
|   CPPUNIT_TEST(referentialaction);
 | |
|   CPPUNIT_TEST(tablecheckconstraint);
 | |
|   CPPUNIT_TEST(tableuniqueconstraint);
 | |
|   CPPUNIT_TEST(tableprimarykeyconstraint);
 | |
|   CPPUNIT_TEST(tablereferencesconstraint);
 | |
|   CPPUNIT_TEST(tabledef);
 | |
| 
 | |
|   CPPUNIT_TEST(createtable);
 | |
|   CPPUNIT_TEST(droptable);
 | |
|   CPPUNIT_TEST(createindex);
 | |
|   CPPUNIT_TEST(dropindex);
 | |
| 
 | |
|   CPPUNIT_TEST(altertableaddcolumn);
 | |
|   CPPUNIT_TEST(altertableaddcolumns);
 | |
|   CPPUNIT_TEST(altertabledropcolumns);
 | |
|   CPPUNIT_TEST(altertableaddtableconstraint);
 | |
|   CPPUNIT_TEST(altertabledropcolumn);
 | |
| 
 | |
|   CPPUNIT_TEST(altertablesetcolumndefault);
 | |
|   CPPUNIT_TEST(altertabledropcolumndefault);
 | |
|   CPPUNIT_TEST(altertabledroptableconstraint);
 | |
| 
 | |
|   CPPUNIT_TEST(altertablerenametable);
 | |
| 
 | |
|   CPPUNIT_TEST(altertablemodifycolumntype);
 | |
| 
 | |
|   CPPUNIT_TEST(altertablerenamecolumn);
 | |
| 
 | |
|   CPPUNIT_TEST_SUITE_END();
 | |
| 
 | |
|  private:
 | |
|  public:
 | |
|   void setUp()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   void tearDown()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   void altertablerenamecolumn()
 | |
|   {
 | |
|     SqlFileParser p;
 | |
|     p.Parse("sql/atrc01.sql");
 | |
| 
 | |
|     if (p.Good())
 | |
|     {
 | |
|       const ParseTree& stmts = p.GetParseTree();
 | |
|       AlterTableStatement* stmt = dynamic_cast<AlterTableStatement*>(stmts[0]);
 | |
|       CPPUNIT_ASSERT(stmt);
 | |
|       t_sertest<AlterTableStatement>(stmt);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void altertablemodifycolumntype()
 | |
|   {
 | |
|     SqlFileParser p;
 | |
|     p.Parse("sql/atmct01.sql");
 | |
| 
 | |
|     if (p.Good())
 | |
|     {
 | |
|       const ParseTree& stmts = p.GetParseTree();
 | |
|       AlterTableStatement* stmt = dynamic_cast<AlterTableStatement*>(stmts[0]);
 | |
|       CPPUNIT_ASSERT(stmt);
 | |
|       t_sertest<AlterTableStatement>(stmt);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void altertablerenametable()
 | |
|   {
 | |
|     SqlFileParser p;
 | |
|     p.Parse("sql/atrt01.sql");
 | |
| 
 | |
|     if (p.Good())
 | |
|     {
 | |
|       const ParseTree& stmts = p.GetParseTree();
 | |
|       AlterTableStatement* stmt = dynamic_cast<AlterTableStatement*>(stmts[0]);
 | |
|       CPPUNIT_ASSERT(stmt);
 | |
|       t_sertest<AlterTableStatement>(stmt);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void altertabledroptableconstraint()
 | |
|   {
 | |
|     SqlFileParser p;
 | |
|     p.Parse("sql/atdtc01.sql");
 | |
| 
 | |
|     if (p.Good())
 | |
|     {
 | |
|       const ParseTree& stmts = p.GetParseTree();
 | |
|       AlterTableStatement* stmt = dynamic_cast<AlterTableStatement*>(stmts[0]);
 | |
|       CPPUNIT_ASSERT(stmt);
 | |
|       t_sertest<AlterTableStatement>(stmt);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void altertabledropcolumndefault()
 | |
|   {
 | |
|     SqlFileParser p;
 | |
|     p.Parse("sql/atmcdd01.sql");
 | |
| 
 | |
|     if (p.Good())
 | |
|     {
 | |
|       const ParseTree& stmts = p.GetParseTree();
 | |
|       AlterTableStatement* stmt = dynamic_cast<AlterTableStatement*>(stmts[0]);
 | |
|       CPPUNIT_ASSERT(stmt);
 | |
|       t_sertest<AlterTableStatement>(stmt);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void altertablesetcolumndefault()
 | |
|   {
 | |
|     SqlFileParser p;
 | |
|     p.Parse("sql/atmcsd01.sql");
 | |
| 
 | |
|     if (p.Good())
 | |
|     {
 | |
|       const ParseTree& stmts = p.GetParseTree();
 | |
|       AlterTableStatement* stmt = dynamic_cast<AlterTableStatement*>(stmts[0]);
 | |
|       CPPUNIT_ASSERT(stmt);
 | |
|       t_sertest<AlterTableStatement>(stmt);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void altertabledropcolumn()
 | |
|   {
 | |
|     SqlFileParser p;
 | |
|     p.Parse("sql/atdc01.sql");
 | |
| 
 | |
|     if (p.Good())
 | |
|     {
 | |
|       const ParseTree& stmts = p.GetParseTree();
 | |
|       AlterTableStatement* stmt = dynamic_cast<AlterTableStatement*>(stmts[0]);
 | |
|       CPPUNIT_ASSERT(stmt);
 | |
|       t_sertest<AlterTableStatement>(stmt);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void altertableaddtableconstraint()
 | |
|   {
 | |
|     SqlFileParser p;
 | |
|     p.Parse("sql/atatc01.sql");
 | |
| 
 | |
|     if (p.Good())
 | |
|     {
 | |
|       const ParseTree& stmts = p.GetParseTree();
 | |
|       AlterTableStatement* stmt = dynamic_cast<AlterTableStatement*>(stmts[0]);
 | |
|       CPPUNIT_ASSERT(stmt);
 | |
|       t_sertest<AlterTableStatement>(stmt);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void altertableaddcolumn()
 | |
|   {
 | |
|     cout << "Serialize test: AtaAddColumn" << endl;
 | |
|     auto_ptr<AtaAddColumn> ata(new AtaAddColumn);
 | |
| 
 | |
|     vector<string> files;
 | |
|     files.push_back("sql/ct01.sql");
 | |
|     files.push_back("sql/ct02.sql");
 | |
|     files.push_back("sql/ct03.sql");
 | |
|     files.push_back("sql/ct04.sql");
 | |
|     files.push_back("sql/ct05.sql");
 | |
|     files.push_back("sql/ct06.sql");
 | |
|     files.push_back("sql/ct07.sql");
 | |
|     files.push_back("sql/ct08.sql");
 | |
|     files.push_back("sql/ct09.sql");
 | |
|     files.push_back("sql/ct10.sql");
 | |
|     files.push_back("sql/ct11.sql");
 | |
| 
 | |
|     vector<string>::const_iterator itr;
 | |
| 
 | |
|     for (itr = files.begin(); itr != files.end(); ++itr)
 | |
|     {
 | |
|       SqlFileParser p;
 | |
|       p.Parse(*itr);
 | |
| 
 | |
|       if (p.Good())
 | |
|       {
 | |
|         const ParseTree& stmts = p.GetParseTree();
 | |
|         CreateTableStatement* ct = dynamic_cast<CreateTableStatement*>(stmts[0]);
 | |
|         CPPUNIT_ASSERT(ct);
 | |
| 
 | |
|         ColumnDefList* columns = &(ct->fTableDef->fColumns);
 | |
| 
 | |
|         ColumnDefList::const_iterator itr;
 | |
| 
 | |
|         for (itr = columns->begin(); itr != columns->end(); ++itr)
 | |
|         {
 | |
|           ata->fColumnDef = *itr;
 | |
|           t_sertest<AtaAddColumn>(ata.get());
 | |
|           // We borrowed the column def from the parse
 | |
|           // tree.  Null it to avoid double free.
 | |
|           ata->fColumnDef = 0;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void altertableaddcolumns()
 | |
|   {
 | |
|     cout << "Serialize test: AtaAddColumnS" << endl;
 | |
|     auto_ptr<AtaAddColumns> ata(new AtaAddColumns);
 | |
| 
 | |
|     vector<string> files;
 | |
|     files.push_back("sql/ct01.sql");
 | |
|     files.push_back("sql/ct02.sql");
 | |
|     files.push_back("sql/ct03.sql");
 | |
|     files.push_back("sql/ct04.sql");
 | |
|     files.push_back("sql/ct05.sql");
 | |
|     files.push_back("sql/ct06.sql");
 | |
|     files.push_back("sql/ct07.sql");
 | |
|     files.push_back("sql/ct08.sql");
 | |
|     files.push_back("sql/ct09.sql");
 | |
|     files.push_back("sql/ct10.sql");
 | |
|     files.push_back("sql/ct11.sql");
 | |
| 
 | |
|     vector<string>::const_iterator itr;
 | |
| 
 | |
|     for (itr = files.begin(); itr != files.end(); ++itr)
 | |
|     {
 | |
|       SqlFileParser p;
 | |
|       p.Parse(*itr);
 | |
| 
 | |
|       if (p.Good())
 | |
|       {
 | |
|         const ParseTree& stmts = p.GetParseTree();
 | |
|         CreateTableStatement* ct = dynamic_cast<CreateTableStatement*>(stmts[0]);
 | |
|         CPPUNIT_ASSERT(ct);
 | |
| 
 | |
|         ata->fColumns = ct->fTableDef->fColumns;
 | |
|         t_sertest<AtaAddColumns>(ata.get());
 | |
|         // We borrowed the column defs from the parse
 | |
|         // tree.  Null it to avoid double free.
 | |
|         ata->fColumns.clear();
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void altertabledropcolumns()
 | |
|   {
 | |
|     ColumnNameList* names = new ColumnNameList;
 | |
|     names->push_back("c1");
 | |
|     names->push_back("c2");
 | |
|     auto_ptr<AtaDropColumns> stmt(new AtaDropColumns(names));
 | |
|     t_sertest<AtaDropColumns>(stmt.get());
 | |
|   }
 | |
| 
 | |
|   void qname()
 | |
|   {
 | |
|     cout << "Serialize test: QualifiedName" << endl;
 | |
|     auto_ptr<QualifiedName> name(new QualifiedName("one", "two", "three"));
 | |
|     u_sertest<QualifiedName>(name.get());
 | |
|   }
 | |
| 
 | |
|   void columntype()
 | |
|   {
 | |
|     cout << "Serialize test: ColumnType" << endl;
 | |
| 
 | |
|     auto_ptr<ColumnType> type(new ColumnType);
 | |
|     type->fType = 1;
 | |
|     type->fLength = 2;
 | |
|     type->fPrecision = 3;
 | |
|     type->fScale = 4;
 | |
|     type->fWithTimezone = true;
 | |
|     u_sertest<ColumnType>(type.get());
 | |
|   }
 | |
| 
 | |
|   void columndefaultvalue()
 | |
|   {
 | |
|     cout << "Serialize test: ColumnDefaultValue" << endl;
 | |
|     auto_ptr<ColumnDefaultValue> dval(new ColumnDefaultValue);
 | |
|     dval->fNull = false;
 | |
|     dval->fValue = "1.234";
 | |
|     u_sertest<ColumnDefaultValue>(dval.get());
 | |
|   }
 | |
| 
 | |
|   void columnconstraintdef()
 | |
|   {
 | |
|     cout << "Serialize test: ColumnConstraintDef" << endl;
 | |
|     auto_ptr<ColumnConstraintDef> con(new ColumnConstraintDef);
 | |
|     con->fDeferrable = true;
 | |
|     con->fCheckTime = DDL_INITIALLY_DEFERRED;
 | |
|     con->fConstraintType = DDL_CHECK;
 | |
|     con->fCheck = "thecheck";
 | |
|     u_sertest<ColumnConstraintDef>(con.get());
 | |
|   }
 | |
| 
 | |
|   /** @brief Can we serialize ColumDefs?
 | |
|    *
 | |
|    * Here we leverage the parser and the ostream operators for
 | |
|    * parser objects to test serialization for ColumnDefs.  We use
 | |
|    * the parser to build parse trees for some create table
 | |
|    * statements.  Then we push the ColumnDefs through a ByteStream
 | |
|    * and compare the results as strings.  In other words, if C is a
 | |
|    * ColumnDef in the parser constructed tree, we write C to the
 | |
|    * ByteStream and then unserialize it back out making a new ColumnDef,
 | |
|    * C'.  We then format C and C' to respective stringstreams and
 | |
|    * then compare the strings.  If they are equal, chances are good
 | |
|    * the serialization is OK.
 | |
|    */
 | |
| 
 | |
|   void columndef_01()
 | |
|   {
 | |
|     cout << "columndef_01" << endl;
 | |
| 
 | |
|     vector<string> files;
 | |
|     files.push_back("sql/ct01.sql");
 | |
|     files.push_back("sql/ct02.sql");
 | |
|     files.push_back("sql/ct03.sql");
 | |
|     files.push_back("sql/ct04.sql");
 | |
|     files.push_back("sql/ct05.sql");
 | |
|     files.push_back("sql/ct06.sql");
 | |
|     files.push_back("sql/ct07.sql");
 | |
|     files.push_back("sql/ct08.sql");
 | |
|     files.push_back("sql/ct09.sql");
 | |
|     files.push_back("sql/ct10.sql");
 | |
|     files.push_back("sql/ct11.sql");
 | |
| 
 | |
|     vector<string>::const_iterator itr;
 | |
| 
 | |
|     for (itr = files.begin(); itr != files.end(); ++itr)
 | |
|     {
 | |
|       cout << "* * * Checking columndef serialization for " << *itr << endl;
 | |
|       SqlFileParser p;
 | |
|       p.Parse(*itr);
 | |
| 
 | |
|       if (p.Good())
 | |
|       {
 | |
|         const ParseTree& stmts = p.GetParseTree();
 | |
|         CreateTableStatement* ct = dynamic_cast<CreateTableStatement*>(stmts[0]);
 | |
|         CPPUNIT_ASSERT(ct);
 | |
| 
 | |
|         cout << "Parsed CreateTable:" << endl;
 | |
|         cout << *ct << endl;
 | |
| 
 | |
|         ColumnDefList* columns = &(ct->fTableDef->fColumns);
 | |
| 
 | |
|         ColumnDefList::const_iterator itr;
 | |
| 
 | |
|         for (itr = columns->begin(); itr != columns->end(); ++itr)
 | |
|         {
 | |
|           u_sertest<ColumnDef>(*itr);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void referentialaction()
 | |
|   {
 | |
|     cout << "Serialize test: ReferentialAction" << endl;
 | |
|     auto_ptr<ReferentialAction> ref(new ReferentialAction);
 | |
|     ref->fOnUpdate = DDL_CASCADE;
 | |
|     ref->fOnDelete = DDL_SET_NULL;
 | |
|     u_sertest<ReferentialAction>(ref.get());
 | |
|   }
 | |
| 
 | |
|   void tablecheckconstraint()
 | |
|   {
 | |
|     cout << "Serialize test: TableCheckConstraintDef" << endl;
 | |
|     auto_ptr<TableCheckConstraintDef> tc(new TableCheckConstraintDef);
 | |
|     tc->fName = "fooby";
 | |
|     tc->fCheck = "check constraint text";
 | |
|     u_sertest<TableCheckConstraintDef>(tc.get());
 | |
|   }
 | |
| 
 | |
|   void tableuniqueconstraint()
 | |
|   {
 | |
|     cout << "Serialize test: TableUniqueConstraintDef" << endl;
 | |
|     auto_ptr<TableUniqueConstraintDef> tc(new TableUniqueConstraintDef);
 | |
|     tc->fName = "fooby";
 | |
|     tc->fColumnNameList.push_back("C1");
 | |
|     tc->fColumnNameList.push_back("C2");
 | |
|     tc->fColumnNameList.push_back("C3");
 | |
|     u_sertest<TableUniqueConstraintDef>(tc.get());
 | |
|   }
 | |
| 
 | |
|   void tableprimarykeyconstraint()
 | |
|   {
 | |
|     cout << "Serialize test: TablePrimaryKeyConstraintDef" << endl;
 | |
|     auto_ptr<TablePrimaryKeyConstraintDef> tc(new TablePrimaryKeyConstraintDef);
 | |
|     tc->fName = "fooby";
 | |
|     tc->fColumnNameList.push_back("C1");
 | |
|     tc->fColumnNameList.push_back("C2");
 | |
|     tc->fColumnNameList.push_back("C3");
 | |
|     u_sertest<TablePrimaryKeyConstraintDef>(tc.get());
 | |
|   }
 | |
| 
 | |
|   void tablereferencesconstraint()
 | |
|   {
 | |
|     cout << "Serialize test: TableReferencesConstraintDef" << endl;
 | |
|     auto_ptr<TableReferencesConstraintDef> tc(new TableReferencesConstraintDef);
 | |
| 
 | |
|     tc->fName = "fooby";
 | |
|     tc->fColumns.push_back("C1");
 | |
|     tc->fColumns.push_back("C2");
 | |
|     tc->fColumns.push_back("C3");
 | |
| 
 | |
|     QualifiedName* qname = new QualifiedName;
 | |
|     qname->fCatalog = "";
 | |
|     qname->fSchema = "calpont";
 | |
|     qname->fName = "table_fooby";
 | |
|     tc->fTableName = qname;
 | |
| 
 | |
|     tc->fForeignColumns.push_back("F1");
 | |
|     tc->fForeignColumns.push_back("F2");
 | |
|     tc->fForeignColumns.push_back("F3");
 | |
| 
 | |
|     tc->fMatchType = DDL_FULL;
 | |
| 
 | |
|     ReferentialAction* ref = new ReferentialAction;
 | |
|     ref->fOnUpdate = DDL_CASCADE;
 | |
|     ref->fOnDelete = DDL_NO_ACTION;
 | |
|     tc->fRefAction = ref;
 | |
| 
 | |
|     u_sertest<TableReferencesConstraintDef>(tc.get());
 | |
|   }
 | |
| 
 | |
|   void tabledef()
 | |
|   {
 | |
|     cout << "tabledef" << endl;
 | |
| 
 | |
|     vector<string> files;
 | |
|     files.push_back("sql/ct01.sql");
 | |
|     files.push_back("sql/ct02.sql");
 | |
|     files.push_back("sql/ct03.sql");
 | |
|     files.push_back("sql/ct04.sql");
 | |
|     files.push_back("sql/ct05.sql");
 | |
|     files.push_back("sql/ct06.sql");
 | |
|     files.push_back("sql/ct07.sql");
 | |
|     files.push_back("sql/ct08.sql");
 | |
|     files.push_back("sql/ct09.sql");
 | |
|     files.push_back("sql/ct10.sql");
 | |
|     files.push_back("sql/ct11.sql");
 | |
| 
 | |
|     vector<string>::const_iterator itr;
 | |
| 
 | |
|     for (itr = files.begin(); itr != files.end(); ++itr)
 | |
|     {
 | |
|       cout << "* * * Checking tabledef serialization for " << *itr << endl;
 | |
|       SqlFileParser p;
 | |
|       p.Parse(*itr);
 | |
| 
 | |
|       if (p.Good())
 | |
|       {
 | |
|         const ParseTree& stmts = p.GetParseTree();
 | |
|         CreateTableStatement* ct = dynamic_cast<CreateTableStatement*>(stmts[0]);
 | |
|         CPPUNIT_ASSERT(ct);
 | |
| 
 | |
|         cout << "Parsed CreateTable:" << endl;
 | |
|         cout << *ct << endl;
 | |
| 
 | |
|         u_sertest<TableDef>(ct->fTableDef);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void createtable()
 | |
|   {
 | |
|     vector<string> files;
 | |
|     files.push_back("sql/ct01.sql");
 | |
|     files.push_back("sql/ct02.sql");
 | |
|     files.push_back("sql/ct03.sql");
 | |
|     files.push_back("sql/ct04.sql");
 | |
|     files.push_back("sql/ct05.sql");
 | |
|     files.push_back("sql/ct06.sql");
 | |
|     files.push_back("sql/ct07.sql");
 | |
|     files.push_back("sql/ct08.sql");
 | |
|     files.push_back("sql/ct09.sql");
 | |
|     files.push_back("sql/ct10.sql");
 | |
|     files.push_back("sql/ct11.sql");
 | |
| 
 | |
|     vector<string>::const_iterator itr;
 | |
| 
 | |
|     for (itr = files.begin(); itr != files.end(); ++itr)
 | |
|     {
 | |
|       cout << "* * * Checking CreateTableStatement serialization for " << *itr << endl;
 | |
|       SqlFileParser p;
 | |
|       p.setDefaultSchema("tpch");
 | |
|       p.Parse(*itr);
 | |
| 
 | |
|       if (p.Good())
 | |
|       {
 | |
|         const ParseTree& stmts = p.GetParseTree();
 | |
|         CreateTableStatement* ct = dynamic_cast<CreateTableStatement*>(stmts[0]);
 | |
|         CPPUNIT_ASSERT(ct);
 | |
| 
 | |
|         cout << "Parsed CreateTable:" << endl;
 | |
|         cout << *ct << endl;
 | |
| 
 | |
|         t_sertest<CreateTableStatement>(ct);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void droptable()
 | |
|   {
 | |
|     vector<string> files;
 | |
|     files.push_back("sql/dt01.sql");
 | |
|     files.push_back("sql/dt02.sql");
 | |
| 
 | |
|     vector<string>::const_iterator itr;
 | |
| 
 | |
|     for (itr = files.begin(); itr != files.end(); ++itr)
 | |
|     {
 | |
|       cout << "* * * Checking DropTableStatement serialization for " << *itr << endl;
 | |
|       SqlFileParser p;
 | |
|       p.Parse(*itr);
 | |
| 
 | |
|       if (p.Good())
 | |
|       {
 | |
|         const ParseTree& stmts = p.GetParseTree();
 | |
|         DropTableStatement* stmt = dynamic_cast<DropTableStatement*>(stmts[0]);
 | |
|         CPPUNIT_ASSERT(stmt);
 | |
| 
 | |
|         cout << "Parsed DropTable:" << endl;
 | |
|         cout << *stmt << endl;
 | |
| 
 | |
|         t_sertest<DropTableStatement>(stmt);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   void createindex()
 | |
|   {
 | |
|     vector<string> files;
 | |
|     files.push_back("sql/ci01.sql");
 | |
|     files.push_back("sql/ci02.sql");
 | |
| 
 | |
|     vector<string>::const_iterator itr;
 | |
| 
 | |
|     for (itr = files.begin(); itr != files.end(); ++itr)
 | |
|     {
 | |
|       cout << "* * * Checking Create Index serialization for " << *itr << endl;
 | |
|       SqlFileParser p;
 | |
|       p.Parse(*itr);
 | |
| 
 | |
|       if (p.Good())
 | |
|       {
 | |
|         const ParseTree& stmts = p.GetParseTree();
 | |
|         CreateIndexStatement* stmt = dynamic_cast<CreateIndexStatement*>(stmts[0]);
 | |
|         CPPUNIT_ASSERT(stmt);
 | |
| 
 | |
|         cout << "Parsed:" << endl;
 | |
|         cout << *stmt << endl;
 | |
| 
 | |
|         t_sertest<CreateIndexStatement>(stmt);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   void dropindex()
 | |
|   {
 | |
|     vector<string> files;
 | |
|     files.push_back("sql/di01.sql");
 | |
| 
 | |
|     vector<string>::const_iterator itr;
 | |
| 
 | |
|     for (itr = files.begin(); itr != files.end(); ++itr)
 | |
|     {
 | |
|       cout << "* * * Checking Drop Index serialization for " << *itr << endl;
 | |
|       SqlFileParser p;
 | |
|       p.Parse(*itr);
 | |
| 
 | |
|       if (p.Good())
 | |
|       {
 | |
|         const ParseTree& stmts = p.GetParseTree();
 | |
|         DropIndexStatement* stmt = dynamic_cast<DropIndexStatement*>(stmts[0]);
 | |
|         CPPUNIT_ASSERT(stmt);
 | |
| 
 | |
|         cout << "Parsed:" << endl;
 | |
|         cout << *stmt << endl;
 | |
| 
 | |
|         t_sertest<DropIndexStatement>(stmt);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| };
 | |
| 
 | |
| CPPUNIT_TEST_SUITE_REGISTRATION(SerializeTest);
 | |
| CPPUNIT_TEST_SUITE_REGISTRATION(ParserTest);
 | |
| 
 | |
| #include <cppunit/extensions/TestFactoryRegistry.h>
 | |
| #include <cppunit/ui/text/TestRunner.h>
 | |
| 
 | |
| 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);
 | |
| }
 | |
| 
 | |
| string itoa(const int i)
 | |
| {
 | |
|   stringstream ss;
 | |
|   ss << i;
 | |
|   return ss.str();
 | |
| }
 |