Skip to content
This repository was archived by the owner on Sep 27, 2019. It is now read-only.

Commit f430f6b

Browse files
authored
Merge branch 'master' into fix/address_sanitizer
2 parents 164179a + a493539 commit f430f6b

File tree

2 files changed

+70
-41
lines changed

2 files changed

+70
-41
lines changed

src/parser/postgresparser.cpp

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
#include "expression/function_expression.h"
2121
#include "expression/operator_expression.h"
2222
#include "expression/star_expression.h"
23-
#include "expression/tuple_value_expression.h"
2423
#include "expression/subquery_expression.h"
24+
#include "expression/tuple_value_expression.h"
2525
#include "parser/pg_list.h"
2626
#include "parser/pg_query.h"
2727
#include "parser/pg_trigger.h"
@@ -286,10 +286,12 @@ expression::AbstractExpression *PostgresParser::ColumnRefTransform(
286286
->val.str));
287287
} else {
288288
result = new expression::TupleValueExpression(
289-
std::string((reinterpret_cast<value *>(
290-
fields->head->next->data.ptr_value))->val.str),
291-
std::string((reinterpret_cast<value *>(
292-
fields->head->data.ptr_value))->val.str));
289+
std::string(
290+
(reinterpret_cast<value *>(fields->head->next->data.ptr_value))
291+
->val.str),
292+
std::string(
293+
(reinterpret_cast<value *>(fields->head->data.ptr_value))
294+
->val.str));
293295
}
294296
break;
295297
}
@@ -659,13 +661,17 @@ expression::AbstractExpression *PostgresParser::ExprTransform(Node *node) {
659661
break;
660662
}
661663
case T_SubLink: {
662-
expr = SubqueryExprTransform(reinterpret_cast<SubLink*>(node));
664+
expr = SubqueryExprTransform(reinterpret_cast<SubLink *>(node));
663665
break;
664666
}
665667
case T_NullTest: {
666668
expr = NullTestTransform(reinterpret_cast<NullTest *>(node));
667669
break;
668670
}
671+
case T_TypeCast: {
672+
expr = TypeCastTransform(reinterpret_cast<TypeCast *>(node));
673+
break;
674+
}
669675
default: {
670676
throw NotImplementedException(StringUtil::Format(
671677
"Expr of type %d not supported yet...\n", node->type));
@@ -732,24 +738,28 @@ expression::AbstractExpression *PostgresParser::AExprTransform(A_Expr *root) {
732738
return result;
733739
}
734740

735-
expression::AbstractExpression* PostgresParser::SubqueryExprTransform(SubLink *node) {
741+
expression::AbstractExpression *PostgresParser::SubqueryExprTransform(
742+
SubLink *node) {
736743
if (node == nullptr) {
737744
return nullptr;
738745
}
739746

740-
expression::AbstractExpression* expr = nullptr;
741-
auto select_stmt = SelectTransform(reinterpret_cast<SelectStmt*>(node->subselect));
747+
expression::AbstractExpression *expr = nullptr;
748+
auto select_stmt =
749+
SelectTransform(reinterpret_cast<SelectStmt *>(node->subselect));
742750
auto subquery_expr = new expression::SubqueryExpression();
743-
subquery_expr->SetSubSelect(reinterpret_cast<SelectStatement*>(select_stmt));
751+
subquery_expr->SetSubSelect(reinterpret_cast<SelectStatement *>(select_stmt));
744752
switch (node->subLinkType) {
745753
case ANY_SUBLINK: {
746754
auto col_expr = ExprTransform(node->testexpr);
747-
expr = new expression::ComparisonExpression(ExpressionType::COMPARE_IN, col_expr, subquery_expr);
755+
expr = new expression::ComparisonExpression(ExpressionType::COMPARE_IN,
756+
col_expr, subquery_expr);
748757
break;
749758
}
750759
case EXISTS_SUBLINK: {
751-
expr = new expression::OperatorExpression(ExpressionType::OPERATOR_EXISTS, type::TypeId::BOOLEAN, subquery_expr,
752-
nullptr);
760+
expr = new expression::OperatorExpression(ExpressionType::OPERATOR_EXISTS,
761+
type::TypeId::BOOLEAN,
762+
subquery_expr, nullptr);
753763
break;
754764
}
755765
case EXPR_SUBLINK: {
@@ -852,7 +862,8 @@ expression::AbstractExpression *PostgresParser::WhenTransform(Node *root) {
852862
// This helper function takes in a Postgres ColumnDef object and transforms
853863
// it into a Peloton ColumnDefinition object. The result of the transformation
854864
// is also stored into the provided statement
855-
void PostgresParser::ColumnDefTransform(ColumnDef *root, parser::CreateStatement* stmt) {
865+
void PostgresParser::ColumnDefTransform(ColumnDef *root,
866+
parser::CreateStatement *stmt) {
856867
TypeName *type_name = root->typeName;
857868
char *name =
858869
(reinterpret_cast<value *>(type_name->names->tail->data.ptr_value)
@@ -901,20 +912,17 @@ void PostgresParser::ColumnDefTransform(ColumnDef *root, parser::CreateStatement
901912
auto col = new ColumnDefinition(ColumnDefinition::DataType::FOREIGN);
902913

903914
col->foreign_key_source.emplace_back(root->colname);
904-
if (constraint->pk_attrs != nullptr)
905-
{
915+
if (constraint->pk_attrs != nullptr) {
906916
auto attr_cell = constraint->pk_attrs->head;
907-
value* attr_val =
908-
reinterpret_cast<value*>(attr_cell->data.ptr_value);
917+
value *attr_val =
918+
reinterpret_cast<value *>(attr_cell->data.ptr_value);
909919
col->foreign_key_sink.emplace_back(attr_val->val.str);
910-
}
911-
else
912-
{
920+
} else {
913921
// Must specify the referenced columns
914922
delete result;
915923
delete col;
916-
throw NotImplementedException(StringUtil::Format(
917-
"Foreign key columns not specified."));
924+
throw NotImplementedException(
925+
StringUtil::Format("Foreign key columns not specified."));
918926
}
919927

920928
// Update Reference Table
@@ -975,7 +983,7 @@ parser::SQLStatement *PostgresParser::CreateTransform(CreateStmt *root) {
975983
if ((node->type) == T_ColumnDef) {
976984
// Transform Regular Column
977985
try {
978-
ColumnDefTransform(reinterpret_cast<ColumnDef*>(node), result);
986+
ColumnDefTransform(reinterpret_cast<ColumnDef *>(node), result);
979987
} catch (NotImplementedException e) {
980988
delete result;
981989
throw e;
@@ -1411,7 +1419,7 @@ parser::DropStatement *PostgresParser::DropIndexTransform(DropStmt *root) {
14111419
auto cell = root->objects->head;
14121420
auto list = reinterpret_cast<List *>(cell->data.ptr_value);
14131421
result->SetIndexName(
1414-
reinterpret_cast<value *>(list->head->data.ptr_value)->val.str);
1422+
reinterpret_cast<value *>(list->head->data.ptr_value)->val.str);
14151423
return result;
14161424
}
14171425

@@ -1484,8 +1492,9 @@ parser::AnalyzeStatement *PostgresParser::VacuumTransform(VacuumStmt *root) {
14841492
return result;
14851493
}
14861494

1487-
parser::VariableSetStatement *PostgresParser::VariableSetTransform(UNUSED_ATTRIBUTE VariableSetStmt* root) {
1488-
VariableSetStatement* res = new VariableSetStatement();
1495+
parser::VariableSetStatement *PostgresParser::VariableSetTransform(
1496+
UNUSED_ATTRIBUTE VariableSetStmt *root) {
1497+
VariableSetStatement *res = new VariableSetStatement();
14891498
return res;
14901499
}
14911500

@@ -1791,7 +1800,7 @@ parser::SQLStatement *PostgresParser::NodeTransform(Node *stmt) {
17911800
result = VacuumTransform((VacuumStmt *)stmt);
17921801
break;
17931802
case T_VariableSetStmt:
1794-
result = VariableSetTransform((VariableSetStmt*)stmt);
1803+
result = VariableSetTransform((VariableSetStmt *)stmt);
17951804
break;
17961805
case T_ExplainStmt:
17971806
result = ExplainTransform(reinterpret_cast<ExplainStmt *>(stmt));
@@ -1807,7 +1816,7 @@ parser::SQLStatement *PostgresParser::NodeTransform(Node *stmt) {
18071816
// This function transfers a list of Postgres statements into
18081817
// a Peloton SQLStatementList object. It traverses the parse list
18091818
// and call the helper for singles nodes.
1810-
parser::SQLStatementList* PostgresParser::ListTransform(List *root) {
1819+
parser::SQLStatementList *PostgresParser::ListTransform(List *root) {
18111820
if (root == nullptr) {
18121821
return nullptr;
18131822
}

test/parser/postgresparser_test.cpp

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ TEST_F(PostgresParserTests, ExpressionUpdateTest) {
394394
(expression::ConstantValueExpression *)update_stmt->updates.at(0)
395395
->value.get();
396396
EXPECT_EQ(CmpBool::CmpTrue, constant->GetValue().CompareEquals(
397-
type::ValueFactory::GetDecimalValue(48)));
397+
type::ValueFactory::GetDecimalValue(48)));
398398

399399
// Test Second Set Condition
400400
EXPECT_EQ(update_stmt->updates.at(1)->column, "s_ytd");
@@ -404,7 +404,7 @@ TEST_F(PostgresParserTests, ExpressionUpdateTest) {
404404
EXPECT_EQ(child1->GetColumnName(), "s_ytd");
405405
auto child2 = (expression::ConstantValueExpression *)op_expr->GetChild(1);
406406
EXPECT_EQ(CmpBool::CmpTrue, child2->GetValue().CompareEquals(
407-
type::ValueFactory::GetIntegerValue(1)));
407+
type::ValueFactory::GetIntegerValue(1)));
408408

409409
// Test Where clause
410410
auto where = (expression::OperatorExpression *)update_stmt->where.get();
@@ -415,14 +415,14 @@ TEST_F(PostgresParserTests, ExpressionUpdateTest) {
415415
EXPECT_EQ(column->GetColumnName(), "s_i_id");
416416
constant = (expression::ConstantValueExpression *)cond1->GetChild(1);
417417
EXPECT_EQ(CmpBool::CmpTrue, constant->GetValue().CompareEquals(
418-
type::ValueFactory::GetIntegerValue(68999)));
418+
type::ValueFactory::GetIntegerValue(68999)));
419419
auto cond2 = (expression::OperatorExpression *)where->GetChild(1);
420420
EXPECT_EQ(cond2->GetExpressionType(), ExpressionType::COMPARE_EQUAL);
421421
column = (expression::TupleValueExpression *)cond2->GetChild(0);
422422
EXPECT_EQ(column->GetColumnName(), "s_w_id");
423423
constant = (expression::ConstantValueExpression *)cond2->GetChild(1);
424424
EXPECT_EQ(CmpBool::CmpTrue, constant->GetValue().CompareEquals(
425-
type::ValueFactory::GetIntegerValue(4)));
425+
type::ValueFactory::GetIntegerValue(4)));
426426
}
427427

428428
TEST_F(PostgresParserTests, StringUpdateTest) {
@@ -857,9 +857,9 @@ TEST_F(PostgresParserTests, ConstraintTest) {
857857
(expression::ConstantValueExpression *)default_expr->GetChild(1);
858858
EXPECT_TRUE(child2 != nullptr);
859859
EXPECT_EQ(CmpBool::CmpTrue, child1->GetValue().CompareEquals(
860-
type::ValueFactory::GetIntegerValue(1)));
860+
type::ValueFactory::GetIntegerValue(1)));
861861
EXPECT_EQ(CmpBool::CmpTrue, child2->GetValue().CompareEquals(
862-
type::ValueFactory::GetIntegerValue(2)));
862+
type::ValueFactory::GetIntegerValue(2)));
863863

864864
// Check Second column
865865
column = create_stmt->columns.at(1).get();
@@ -907,13 +907,13 @@ TEST_F(PostgresParserTests, ConstraintTest) {
907907
(expression::ConstantValueExpression *)check_child1->GetChild(1);
908908
EXPECT_TRUE(plus_child2 != nullptr);
909909
EXPECT_EQ(CmpBool::CmpTrue, plus_child2->GetValue().CompareEquals(
910-
type::ValueFactory::GetIntegerValue(1)));
910+
type::ValueFactory::GetIntegerValue(1)));
911911
auto check_child2 =
912912
(expression::ConstantValueExpression *)column->check_expression->GetChild(
913913
1);
914914
EXPECT_TRUE(check_child2 != nullptr);
915915
EXPECT_EQ(CmpBool::CmpTrue, check_child2->GetValue().CompareEquals(
916-
type::ValueFactory::GetIntegerValue(0)));
916+
type::ValueFactory::GetIntegerValue(0)));
917917

918918
// Check the last foreign key
919919
column = create_stmt->foreign_keys.at(2).get();
@@ -1090,7 +1090,7 @@ TEST_F(PostgresParserTests, FuncCallTest) {
10901090
(expression::ConstantValueExpression *)fun_expr->GetChild(0);
10911091
EXPECT_TRUE(const_expr != nullptr);
10921092
EXPECT_EQ(CmpBool::CmpTrue, const_expr->GetValue().CompareEquals(
1093-
type::ValueFactory::GetIntegerValue(1)));
1093+
type::ValueFactory::GetIntegerValue(1)));
10941094
auto tv_expr = (expression::TupleValueExpression *)fun_expr->GetChild(1);
10951095
EXPECT_TRUE(tv_expr != nullptr);
10961096
EXPECT_EQ("a", tv_expr->GetColumnName());
@@ -1104,7 +1104,7 @@ TEST_F(PostgresParserTests, FuncCallTest) {
11041104
const_expr = (expression::ConstantValueExpression *)fun_expr->GetChild(0);
11051105
EXPECT_TRUE(const_expr != nullptr);
11061106
EXPECT_EQ(CmpBool::CmpTrue, const_expr->GetValue().CompareEquals(
1107-
type::ValueFactory::GetIntegerValue(99)));
1107+
type::ValueFactory::GetIntegerValue(99)));
11081108

11091109
// Check FUN(b) > 2
11101110
auto op_expr =
@@ -1120,7 +1120,7 @@ TEST_F(PostgresParserTests, FuncCallTest) {
11201120
const_expr = (expression::ConstantValueExpression *)op_expr->GetChild(1);
11211121
EXPECT_TRUE(const_expr != nullptr);
11221122
EXPECT_EQ(CmpBool::CmpTrue, const_expr->GetValue().CompareEquals(
1123-
type::ValueFactory::GetIntegerValue(2)));
1123+
type::ValueFactory::GetIntegerValue(2)));
11241124
}
11251125

11261126
TEST_F(PostgresParserTests, UDFFuncCallTest) {
@@ -1143,7 +1143,7 @@ TEST_F(PostgresParserTests, UDFFuncCallTest) {
11431143
(expression::ConstantValueExpression *)fun_expr->GetChild(0);
11441144
EXPECT_TRUE(const_expr != nullptr);
11451145
EXPECT_EQ(CmpBool::CmpTrue, const_expr->GetValue().CompareEquals(
1146-
type::ValueFactory::GetIntegerValue(1)));
1146+
type::ValueFactory::GetIntegerValue(1)));
11471147

11481148
auto tv_expr = (expression::TupleValueExpression *)fun_expr->GetChild(1);
11491149
EXPECT_TRUE(tv_expr != nullptr);
@@ -1220,5 +1220,25 @@ TEST_F(PostgresParserTests, TypeCastTest) {
12201220
}
12211221
}
12221222

1223+
TEST_F(PostgresParserTests, TypeCastInExpressionTest) {
1224+
std::vector<std::string> queries;
1225+
queries.push_back("SELECT * FROM a WHERE d <= date '2018-04-04';");
1226+
queries.push_back("SELECT '12345'::INTEGER - 12");
1227+
// Parsing
1228+
UNUSED_ATTRIBUTE int ii = 0;
1229+
for (auto query : queries) {
1230+
std::unique_ptr<parser::SQLStatementList> result(
1231+
parser::PostgresParser::ParseSQLString(query.c_str()));
1232+
1233+
if (result->is_valid == false) {
1234+
LOG_ERROR("Message: %s, line: %d, col: %d", result->parser_msg,
1235+
result->error_line, result->error_col);
1236+
}
1237+
EXPECT_EQ(result->is_valid, true);
1238+
1239+
LOG_TRACE("%d : %s", ++ii, result->GetInfo().c_str());
1240+
}
1241+
}
1242+
12231243
} // namespace test
12241244
} // namespace peloton

0 commit comments

Comments
 (0)