13
13
#include < memory>
14
14
15
15
#include " catalog/catalog.h"
16
+ #include " common/exception.h"
16
17
#include " common/harness.h"
17
18
#include " concurrency/transaction_manager_factory.h"
18
19
#include " executor/create_executor.h"
@@ -103,6 +104,12 @@ void CreateAndLoadTable7() {
103
104
TestingSQLUtil::ExecuteSQLQuery (" INSERT INTO test7 VALUES (55, 8, 999);" );
104
105
}
105
106
107
+ void CreateAndLoadTable8 () {
108
+ // Create a table with some defaults
109
+ TestingSQLUtil::ExecuteSQLQuery (
110
+ " CREATE TABLE test8(num1 int, num2 int, num3 int not null);" );
111
+ }
112
+
106
113
TEST_F (InsertSQLTests, InsertOneValue) {
107
114
auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance ();
108
115
auto txn = txn_manager.BeginTransaction ();
@@ -204,7 +211,7 @@ TEST_F(InsertSQLTests, InsertSpecifyColumns) {
204
211
catalog::Catalog::GetInstance ()->CreateDatabase (DEFAULT_DB_NAME, txn);
205
212
txn_manager.CommitTransaction (txn);
206
213
207
- CreateAndLoadTable ();
214
+ CreateAndLoadTable8 ();
208
215
209
216
std::vector<ResultValue> result;
210
217
std::vector<FieldInfo> tuple_descriptor;
@@ -214,7 +221,8 @@ TEST_F(InsertSQLTests, InsertSpecifyColumns) {
214
221
new optimizer::Optimizer ());
215
222
216
223
// INSERT a tuple with columns specified
217
- std::string query (" INSERT INTO test (b, a, c) VALUES (99, 8, 111);" );
224
+ std::string query (
225
+ " INSERT INTO test8 (num3, num2, num1) VALUES (99, 8, 111);" );
218
226
219
227
txn = txn_manager.BeginTransaction ();
220
228
auto plan = TestingSQLUtil::GeneratePlanWithOptimizer (optimizer, query, txn);
@@ -228,12 +236,12 @@ TEST_F(InsertSQLTests, InsertSpecifyColumns) {
228
236
229
237
// SELECT to find out if the tuple is correctly inserted
230
238
TestingSQLUtil::ExecuteSQLQueryWithOptimizer (
231
- optimizer, " SELECT * FROM test WHERE a =8" , result, tuple_descriptor,
239
+ optimizer, " SELECT * FROM test8 WHERE num2 =8" , result, tuple_descriptor,
232
240
rows_changed, error_message);
233
241
EXPECT_EQ (3 , result.size ());
234
- EXPECT_EQ (" 8 " , TestingSQLUtil::GetResultValueAsString (result, 0 ));
235
- EXPECT_EQ (" 99 " , TestingSQLUtil::GetResultValueAsString (result, 1 ));
236
- EXPECT_EQ (" 111 " , TestingSQLUtil::GetResultValueAsString (result, 2 ));
242
+ EXPECT_EQ (" 111 " , TestingSQLUtil::GetResultValueAsString (result, 0 ));
243
+ EXPECT_EQ (" 8 " , TestingSQLUtil::GetResultValueAsString (result, 1 ));
244
+ EXPECT_EQ (" 99 " , TestingSQLUtil::GetResultValueAsString (result, 2 ));
237
245
238
246
// free the database just created
239
247
txn = txn_manager.BeginTransaction ();
@@ -620,6 +628,87 @@ TEST_F(InsertSQLTests, NonExistentTable) {
620
628
EXPECT_THROW (TestingSQLUtil::GeneratePlanWithOptimizer (optimizer, query, txn),
621
629
peloton::CatalogException);
622
630
txn_manager.CommitTransaction (txn);
631
+
632
+ // free the database just created
633
+ txn = txn_manager.BeginTransaction ();
634
+ catalog::Catalog::GetInstance ()->DropDatabaseWithName (DEFAULT_DB_NAME, txn);
635
+ txn_manager.CommitTransaction (txn);
636
+ }
637
+
638
+ TEST_F (InsertSQLTests, BadInserts) {
639
+ auto &txn_manager = concurrency::TransactionManagerFactory::GetInstance ();
640
+ auto txn = txn_manager.BeginTransaction ();
641
+ catalog::Catalog::GetInstance ()->CreateDatabase (DEFAULT_DB_NAME, txn);
642
+ txn_manager.CommitTransaction (txn);
643
+
644
+ CreateAndLoadTable8 ();
645
+
646
+ std::vector<ResultValue> result;
647
+ std::vector<FieldInfo> tuple_descriptor;
648
+ std::string error_message;
649
+ std::unique_ptr<optimizer::AbstractOptimizer> optimizer (
650
+ new optimizer::Optimizer ());
651
+ // Insert a tuple with more values than target columns
652
+ std::string query (" INSERT INTO test8 VALUES(1, 2, 3, 4);" );
653
+ txn = txn_manager.BeginTransaction ();
654
+ EXPECT_THROW (TestingSQLUtil::GeneratePlanWithOptimizer (optimizer, query, txn),
655
+ peloton::CatalogException);
656
+ txn_manager.CommitTransaction (txn);
657
+
658
+ // Insert a tuple with more target columns (implicit) than values, violating
659
+ // not null constraint for num3
660
+ query = " INSERT INTO test VALUES(3, 4);" ;
661
+ txn = txn_manager.BeginTransaction ();
662
+ EXPECT_THROW (TestingSQLUtil::GeneratePlanWithOptimizer (optimizer, query, txn),
663
+ peloton::CatalogException);
664
+ txn_manager.CommitTransaction (txn);
665
+
666
+ // Insert a tuple with more target columns than values
667
+ query = " INSERT INTO test8(num1, num3) VALUES(3);" ;
668
+ txn = txn_manager.BeginTransaction ();
669
+ EXPECT_THROW (TestingSQLUtil::GeneratePlanWithOptimizer (optimizer, query, txn),
670
+ peloton::CatalogException);
671
+ txn_manager.CommitTransaction (txn);
672
+
673
+ // Insert a tuple with more values than target columns (multiple tuples)
674
+ query = " INSERT INTO test8(num1, num3) VALUES (1, 2), (3, 4), (3, 4, 5);" ;
675
+ txn = txn_manager.BeginTransaction ();
676
+ EXPECT_THROW (TestingSQLUtil::GeneratePlanWithOptimizer (optimizer, query, txn),
677
+ peloton::CatalogException);
678
+ txn_manager.CommitTransaction (txn);
679
+
680
+ // Insert a tuple with more target columns than values (multiple tuples)
681
+ query = " INSERT INTO test8(num1, num3) VALUES (6, 7), (5);" ;
682
+ txn = txn_manager.BeginTransaction ();
683
+ EXPECT_THROW (TestingSQLUtil::GeneratePlanWithOptimizer (optimizer, query, txn),
684
+ peloton::CatalogException);
685
+ txn_manager.CommitTransaction (txn);
686
+
687
+ // Insert a tuple with a nonexistent target column
688
+ query = " INSERT INTO test8(numx) VALUES(3);" ;
689
+ txn = txn_manager.BeginTransaction ();
690
+ EXPECT_THROW (TestingSQLUtil::GeneratePlanWithOptimizer (optimizer, query, txn),
691
+ peloton::CatalogException);
692
+ txn_manager.CommitTransaction (txn);
693
+
694
+ // Insert a tuple with a nonexistent target column (non-singleton tuple)
695
+ query = " INSERT INTO test8(num1, num4) VALUES(3, 4);" ;
696
+ txn = txn_manager.BeginTransaction ();
697
+ EXPECT_THROW (TestingSQLUtil::GeneratePlanWithOptimizer (optimizer, query, txn),
698
+ peloton::CatalogException);
699
+ txn_manager.CommitTransaction (txn);
700
+
701
+ // Insert a tuple row with not-null field (num3) unspecified
702
+ query = " INSERT INTO test8 VALUES(1, 2)" ;
703
+ txn = txn_manager.BeginTransaction ();
704
+ EXPECT_THROW (TestingSQLUtil::GeneratePlanWithOptimizer (optimizer, query, txn),
705
+ peloton::CatalogException);
706
+ txn_manager.CommitTransaction (txn);
707
+
708
+ // free the database just created
709
+ txn = txn_manager.BeginTransaction ();
710
+ catalog::Catalog::GetInstance ()->DropDatabaseWithName (DEFAULT_DB_NAME, txn);
711
+ txn_manager.CommitTransaction (txn);
623
712
}
624
713
625
714
} // namespace test
0 commit comments