Commit d8d1cdf7 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

TypeError...

parent 0d513806
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
#include <vector>
#include "compile.h"
#include "svalue.h"
#include <fnordmetric/util/runtimeexception.h>

namespace fnordmetric {
namespace query {
@@ -24,7 +25,9 @@ bool executeExpression(

  /* execute children */
  for (auto cur = expr->child; cur != nullptr; cur = cur->next) {
    assert(argc < sizeof(argv) / sizeof(SValue));
    if (argc >= sizeof(argv) / sizeof(SValue)) {
      RAISE(util::RuntimeException, "too many arguments");
    }

    int out_len = 0;
    if (!executeExpression(
@@ -37,7 +40,10 @@ bool executeExpression(
      return false;
    }

    assert(out_len == 1);
    if (out_len != 1) {
      RAISE(util::RuntimeException, "expression did not return");
    }

    argc++;
  }

@@ -67,16 +73,18 @@ bool executeExpression(
    }

    case X_INPUT: {
      uint64_t index = (uint64_t) expr->arg0;
      assert(index < row_len);
      auto index = reinterpret_cast<uint64_t>(expr->arg0);

      if (index >= row_len) {
        RAISE(util::RuntimeException, "invalid row index %i", index);
      }

      *outv = row[index];
      *outc = 1;
      return true;
    }

  }

  assert(0);
}

}
+9 −6
Original line number Diff line number Diff line
@@ -30,25 +30,28 @@ union sum_expr_scratchpad {
};

static void sumExpr(void* scratchpad, int argc, SValue* argv, SValue* out) {
  assert(argc == 1);
  SValue* val = argv;

  union sum_expr_scratchpad* data = (union sum_expr_scratchpad*) scratchpad;

  if (argc != 1) {
    RAISE(
        util::RuntimeException,
        "wrong number of arguments for sum(). expected: 1, got: %i\n",
        argc);
  }

  switch(val->getType()) {
    case SValue::T_INTEGER:
      data->t_integer += val->getInteger();
      *out = SValue((int64_t) data->t_integer);
      return;

    case SValue::T_FLOAT:
    default:
      data->t_float += val->getFloat();
      *out = SValue(data->t_float);
      return;
    default:
      break;
  }

  assert(0);
}

static SymbolTableEntry __sum_symbol(
+2 −6
Original line number Diff line number Diff line
@@ -27,11 +27,11 @@ size_t Parser::parse(const char* query, size_t len) {
  cur_token_ = token_list_.data();
  token_list_end_ = cur_token_ + token_list_.size();

  while (cur_token_ < token_list_end_ && errors_.size() == 0) {
  while (cur_token_ < token_list_end_) {
    root_.appendChild(statement());
  }

  return errors_.size() == 0;
  return true;
}

ASTNode* Parser::expr(int precedence /* = 0 */) {
@@ -658,10 +658,6 @@ bool Parser::assertExpectation(Token::kTokenType expectation) {
  return true;
}

const std::vector<Parser::ParserError>& Parser::getErrors() const {
  return errors_;
}

const std::vector<ASTNode*>& Parser::getStatements() const {
  return root_.getChildren();
}
+0 −13
Original line number Diff line number Diff line
@@ -23,16 +23,6 @@ namespace query {
class Parser {
  friend class QueryTest;
public:
  enum kParserErrorType {
    ERR_UNEXPECTED_TOKEN,
    ERR_INTERNAL_ERROR,
  };

  struct ParserError {
    kParserErrorType type;
    const char* msg;
  };

  struct ParseError : public fnordmetric::util::RuntimeException {
    template <typename... T>
    ParseError(
@@ -66,7 +56,6 @@ public:
   */
  size_t parse(const char* query, size_t len);

  const std::vector<ParserError>& getErrors() const;
  const std::vector<ASTNode*>& getStatements() const;
  const std::vector<Token>& getTokenList() const;

@@ -109,7 +98,6 @@ protected:
  ASTNode* powExpr(ASTNode* lhs, int precedence);

  bool assertExpectation(Token::kTokenType expectation);
  void addError(kParserErrorType type, const char* msg);

  inline Token* consumeToken() {
    auto token = cur_token_;
@@ -143,7 +131,6 @@ protected:
  std::vector<Token> token_list_;
  Token* cur_token_;
  Token* token_list_end_;
  std::vector<ParserError> errors_;
  ASTNode root_;
};

+24 −19
Original line number Diff line number Diff line
@@ -73,7 +73,6 @@ class TestTable2Ref : public TableRef {

TEST_CASE(QueryTest, TestSimpleValueExpression, [] () {
  auto parser = parseTestQuery("SELECT 23 + 5.123 FROM sometable;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(*stmt == ASTNode::T_SELECT);
@@ -99,7 +98,6 @@ TEST_CASE(QueryTest, TestSimpleValueExpression, [] () {

TEST_CASE(QueryTest, TestArithmeticValueExpression, [] () {
  auto parser = parseTestQuery("SELECT 1 + 2 / 3;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  auto expr = parser.getStatements()[0]
      ->getChildren()[0]->getChildren()[0]->getChildren()[0];
@@ -114,7 +112,6 @@ TEST_CASE(QueryTest, TestArithmeticValueExpression, [] () {

TEST_CASE(QueryTest, TestArithmeticValueExpressionParens, [] () {
  auto parser = parseTestQuery("SELECT (1 * 2) + 3;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  auto expr = parser.getStatements()[0]
      ->getChildren()[0]->getChildren()[0]->getChildren()[0];
@@ -130,7 +127,6 @@ TEST_CASE(QueryTest, TestArithmeticValueExpressionParens, [] () {
TEST_CASE(QueryTest, TestArithmeticValueExpressionPrecedence, [] () {
  {
    auto parser = parseTestQuery("SELECT 1 * 2 + 3;");
    EXPECT(parser.getErrors().size() == 0);
    EXPECT(parser.getStatements().size() == 1);
    auto expr = parser.getStatements()[0]
        ->getChildren()[0]->getChildren()[0]->getChildren()[0];
@@ -144,7 +140,6 @@ TEST_CASE(QueryTest, TestArithmeticValueExpressionPrecedence, [] () {
  }
  {
    auto parser = parseTestQuery("SELECT 1 + 2 * 3;");
    EXPECT(parser.getErrors().size() == 0);
    EXPECT(parser.getStatements().size() == 1);
    auto expr = parser.getStatements()[0]
        ->getChildren()[0]->getChildren()[0]->getChildren()[0];
@@ -160,7 +155,6 @@ TEST_CASE(QueryTest, TestArithmeticValueExpressionPrecedence, [] () {

TEST_CASE(QueryTest, TestMethodCallValueExpression, [] () {
  auto parser = parseTestQuery("SELECT 1 + sum(23, 4 + 1) FROM sometable;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(*stmt == ASTNode::T_SELECT);
@@ -193,7 +187,6 @@ TEST_CASE(QueryTest, TestMethodCallValueExpression, [] () {

TEST_CASE(QueryTest, TestNegatedValueExpression, [] () {
  auto parser = parseTestQuery("SELECT -(23 + 5.123) AS fucol FROM tbl;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(*stmt == ASTNode::T_SELECT);
@@ -226,7 +219,6 @@ TEST_CASE(QueryTest, TestNegatedValueExpression, [] () {

TEST_CASE(QueryTest, TestSelectWildcard, [] () {
  auto parser = parseTestQuery("SELECT * FROM sometable;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(*stmt == ASTNode::T_SELECT);
@@ -242,7 +234,6 @@ TEST_CASE(QueryTest, TestSelectWildcard, [] () {

TEST_CASE(QueryTest, TestSelectTableWildcard, [] () {
  auto parser = parseTestQuery("SELECT mytablex.* FROM sometable;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(*stmt == ASTNode::T_SELECT);
@@ -261,7 +252,6 @@ TEST_CASE(QueryTest, TestSelectTableWildcard, [] () {

TEST_CASE(QueryTest, TestSelectDerivedColumn, [] () {
  auto parser = parseTestQuery("SELECT somecol AS another FROM sometable;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(*stmt == ASTNode::T_SELECT);
@@ -284,7 +274,6 @@ TEST_CASE(QueryTest, TestSelectDerivedColumn, [] () {

TEST_CASE(QueryTest, TestSelectDerivedColumnWithTableName, [] () {
  auto parser = parseTestQuery("SELECT tbl.col AS another FROM sometable;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(*stmt == ASTNode::T_SELECT);
@@ -324,7 +313,6 @@ TEST_CASE(QueryTest, TestSelectMustBeFirstAssert, [] () {

TEST_CASE(QueryTest, TestFromList, [] () {
  auto parser = parseTestQuery("SELECT a FROM tbl1, tbl2;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  const auto& from = stmt->getChildren()[1];
@@ -338,7 +326,6 @@ TEST_CASE(QueryTest, TestFromList, [] () {

TEST_CASE(QueryTest, TestWhereClause, [] () {
  auto parser = parseTestQuery("SELECT x FROM t WHERE a=1 AND a+1=2 OR b=3;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(stmt->getChildren().size() == 3);
@@ -350,7 +337,6 @@ TEST_CASE(QueryTest, TestWhereClause, [] () {

TEST_CASE(QueryTest, TestGroupByClause, [] () {
  auto parser = parseTestQuery("select count(x), y from t GROUP BY x;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(stmt->getChildren().size() == 3);
@@ -362,7 +348,6 @@ TEST_CASE(QueryTest, TestGroupByClause, [] () {

TEST_CASE(QueryTest, TestOrderByClause, [] () {
  auto parser = parseTestQuery("select a FROM t ORDER BY a DESC;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(stmt->getChildren().size() == 3);
@@ -375,7 +360,6 @@ TEST_CASE(QueryTest, TestOrderByClause, [] () {

TEST_CASE(QueryTest, TestHavingClause, [] () {
  auto parser = parseTestQuery("select a FROM t HAVING 1=1;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(stmt->getChildren().size() == 3);
@@ -387,7 +371,6 @@ TEST_CASE(QueryTest, TestHavingClause, [] () {

TEST_CASE(QueryTest, TestLimitClause, [] () {
  auto parser = parseTestQuery("select a FROM t LIMIT 10;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(stmt->getChildren().size() == 3);
@@ -399,7 +382,6 @@ TEST_CASE(QueryTest, TestLimitClause, [] () {

TEST_CASE(QueryTest, TestLimitOffsetClause, [] () {
  auto parser = parseTestQuery("select a FROM t LIMIT 10 OFFSET 23;");
  EXPECT(parser.getErrors().size() == 0);
  EXPECT(parser.getStatements().size() == 1);
  const auto& stmt = parser.getStatements()[0];
  EXPECT(stmt->getChildren().size() == 3);
@@ -528,7 +510,6 @@ TEST_INITIALIZER(QueryTest, InitializeComplexQueries, [] () {
        "TestComplexQueries",
        [query] () {
          auto parser = parseTestQuery(query);
          EXPECT(parser.getErrors().size() == 0);
          EXPECT(parser.getStatements().size() == 1);
        });
  }
@@ -869,4 +850,28 @@ TEST_CASE(QueryTest, TestSimpleSelectFromCSV, [] () {
  EXPECT(results->getNumRows() == 191);
});

TEST_CASE(QueryTest, TestSimpleAggregateFromCSV, [] () {
  auto csv_table = new csv_backend::CSVTableRef(
      csv_backend::CSVInputStream::openFile(
          "test/fixtures/gbp_per_country_simple.csv"), 
      true);

  TableRepository repo;
  repo.addTableRef("gbp_per_country",
      std::unique_ptr<csv_backend::CSVTableRef>(csv_table));

  auto query = Query(
      "  SELECT"
      "    sum(gbp) as global_gbp"
      "  FROM"
      "    gbp_per_country;",
      &repo);

  query.execute();
  auto results = query.getResultList(0);
  EXPECT(results->getNumRows() == 123);
});



Loading