duckdb 0.3.2-dev685.0 → 0.3.2-dev706.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "duckdb",
3
3
  "main": "./lib/duckdb.js",
4
- "version": "0.3.2-dev685.0",
4
+ "version": "0.3.2-dev706.0",
5
5
  "description": "DuckDB node.js API",
6
6
  "gypfile": true,
7
7
  "dependencies": {
package/src/duckdb.cpp CHANGED
@@ -138060,6 +138060,7 @@ typedef struct PGCreateEnumStmt
138060
138060
  namespace duckdb {
138061
138061
 
138062
138062
  class ColumnDefinition;
138063
+ class StackChecker;
138063
138064
  struct OrderByNode;
138064
138065
  struct CopyInfo;
138065
138066
  struct CommonTableExpressionInfo;
@@ -138070,10 +138071,10 @@ struct GroupingExpressionMap;
138070
138071
  class Transformer {
138071
138072
  static constexpr const idx_t DEFAULT_MAX_EXPRESSION_DEPTH = 1000;
138072
138073
 
138074
+ friend class StackChecker;
138075
+
138073
138076
  public:
138074
- explicit Transformer(Transformer *parent = nullptr, idx_t max_expression_depth_p = DEFAULT_MAX_EXPRESSION_DEPTH)
138075
- : parent(parent), max_expression_depth(parent ? parent->max_expression_depth : max_expression_depth_p) {
138076
- }
138077
+ explicit Transformer(Transformer *parent = nullptr, idx_t max_expression_depth_p = DEFAULT_MAX_EXPRESSION_DEPTH);
138077
138078
 
138078
138079
  //! Transforms a Postgres parse tree into a set of SQL Statements
138079
138080
  bool TransformParseTree(duckdb_libpgquery::PGList *tree, vector<unique_ptr<SQLStatement>> &statements);
@@ -138285,14 +138286,23 @@ private:
138285
138286
  unique_ptr<SampleOptions> TransformSampleOptions(duckdb_libpgquery::PGNode *options);
138286
138287
 
138287
138288
  private:
138288
- //! Default stack limit of the transformer
138289
- constexpr static idx_t MAX_STACK_SIZE = 1024 * 100;
138290
- //! For iterative functions that create recursive objects, this is our default stack size per element
138291
- constexpr static idx_t DEFAULT_ENTRY_STACK_SIZE = 100;
138292
- int *root = nullptr;
138289
+ //! Current stack depth
138290
+ idx_t stack_depth;
138291
+
138292
+ void InitializeStackCheck();
138293
+ StackChecker StackCheck(idx_t extra_stack = 1);
138294
+ };
138295
+
138296
+ class StackChecker {
138297
+ public:
138298
+ StackChecker(Transformer &transformer, idx_t stack_usage);
138299
+ ~StackChecker();
138300
+ StackChecker(StackChecker &&) noexcept;
138301
+ StackChecker(const StackChecker &) = delete;
138293
138302
 
138294
- void InitializeStackCheck(int *stack_check_var);
138295
- void StackCheck(idx_t extra_stack = 0);
138303
+ private:
138304
+ Transformer &transformer;
138305
+ idx_t stack_usage;
138296
138306
  };
138297
138307
 
138298
138308
  } // namespace duckdb
@@ -140340,7 +140350,7 @@ unique_ptr<ParsedExpression> Transformer::TransformArrayAccess(duckdb_libpgquery
140340
140350
  throw NotImplementedException("Unimplemented subscript type");
140341
140351
  }
140342
140352
  list_size++;
140343
- StackCheck(list_size * DEFAULT_ENTRY_STACK_SIZE);
140353
+ StackCheck(list_size);
140344
140354
  }
140345
140355
  return result;
140346
140356
  }
@@ -140667,7 +140677,7 @@ unique_ptr<ParsedExpression> Transformer::TransformExpression(duckdb_libpgquery:
140667
140677
  return nullptr;
140668
140678
  }
140669
140679
 
140670
- StackCheck();
140680
+ auto stack_checker = StackCheck();
140671
140681
 
140672
140682
  switch (node->type) {
140673
140683
  case duckdb_libpgquery::T_PGColumnRef:
@@ -144158,7 +144168,7 @@ namespace duckdb {
144158
144168
 
144159
144169
  unique_ptr<QueryNode> Transformer::TransformSelectNode(duckdb_libpgquery::PGSelectStmt *stmt) {
144160
144170
  D_ASSERT(stmt->type == duckdb_libpgquery::T_PGSelectStmt);
144161
- StackCheck();
144171
+ auto stack_checker = StackCheck();
144162
144172
 
144163
144173
  unique_ptr<QueryNode> node;
144164
144174
 
@@ -144544,7 +144554,7 @@ unique_ptr<TableRef> Transformer::TransformFrom(duckdb_libpgquery::PGList *root)
144544
144554
  cur_root = result.get();
144545
144555
  }
144546
144556
  list_size++;
144547
- StackCheck(list_size * DEFAULT_ENTRY_STACK_SIZE);
144557
+ StackCheck(list_size);
144548
144558
  }
144549
144559
  return move(result);
144550
144560
  }
@@ -144695,7 +144705,7 @@ unique_ptr<TableRef> Transformer::TransformRangeFunction(duckdb_libpgquery::PGRa
144695
144705
  namespace duckdb {
144696
144706
 
144697
144707
  unique_ptr<TableRef> Transformer::TransformTableRefNode(duckdb_libpgquery::PGNode *n) {
144698
- StackCheck();
144708
+ auto stack_checker = StackCheck();
144699
144709
 
144700
144710
  switch (n->type) {
144701
144711
  case duckdb_libpgquery::T_PGRangeVar:
@@ -144740,9 +144750,27 @@ unique_ptr<TableRef> Transformer::TransformTableRefNode(duckdb_libpgquery::PGNod
144740
144750
 
144741
144751
  namespace duckdb {
144742
144752
 
144753
+ StackChecker::StackChecker(Transformer &transformer_p, idx_t stack_usage_p)
144754
+ : transformer(transformer_p), stack_usage(stack_usage_p) {
144755
+ transformer.stack_depth += stack_usage;
144756
+ }
144757
+
144758
+ StackChecker::~StackChecker() {
144759
+ transformer.stack_depth -= stack_usage;
144760
+ }
144761
+
144762
+ StackChecker::StackChecker(StackChecker &&other) noexcept
144763
+ : transformer(other.transformer), stack_usage(other.stack_usage) {
144764
+ other.stack_usage = 0;
144765
+ }
144766
+
144767
+ Transformer::Transformer(Transformer *parent, idx_t max_expression_depth_p)
144768
+ : parent(parent), max_expression_depth(parent ? parent->max_expression_depth : max_expression_depth_p),
144769
+ stack_depth(DConstants::INVALID_INDEX) {
144770
+ }
144771
+
144743
144772
  bool Transformer::TransformParseTree(duckdb_libpgquery::PGList *tree, vector<unique_ptr<SQLStatement>> &statements) {
144744
- int stack_check_var;
144745
- InitializeStackCheck(&stack_check_var);
144773
+ InitializeStackCheck();
144746
144774
  for (auto entry = tree->head; entry != nullptr; entry = entry->next) {
144747
144775
  SetParamCount(0);
144748
144776
  auto stmt = TransformStatement((duckdb_libpgquery::PGNode *)entry->data.ptr_value);
@@ -144753,24 +144781,20 @@ bool Transformer::TransformParseTree(duckdb_libpgquery::PGList *tree, vector<uni
144753
144781
  return true;
144754
144782
  }
144755
144783
 
144756
- void Transformer::InitializeStackCheck(int *stack_check_var) {
144757
- this->root = stack_check_var;
144784
+ void Transformer::InitializeStackCheck() {
144785
+ stack_depth = 0;
144758
144786
  }
144759
144787
 
144760
- void Transformer::StackCheck(idx_t extra_stack) {
144761
- if (!root) {
144762
- return;
144788
+ StackChecker Transformer::StackCheck(idx_t extra_stack) {
144789
+ auto node = this;
144790
+ while (node->parent) {
144791
+ node = node->parent;
144763
144792
  }
144764
- int current_stack_var;
144765
- if (&current_stack_var > root) {
144766
- throw InternalException("Transformer::StackCheck variables are incorrectly set up");
144767
- }
144768
- idx_t stack_size = root - &current_stack_var + extra_stack;
144769
- if (stack_size > MAX_STACK_SIZE) {
144770
- throw ParserException(
144771
- "Stack usage in parsing is too high: the query tree is too deep (stack usage %lld, max stack usage %lld)",
144772
- stack_size, MAX_STACK_SIZE);
144793
+ D_ASSERT(node->stack_depth != DConstants::INVALID_INDEX);
144794
+ if (node->stack_depth + extra_stack >= max_expression_depth) {
144795
+ throw ParserException("Max expression depth limit of %lld exceeded", max_expression_depth);
144773
144796
  }
144797
+ return StackChecker(*node, extra_stack);
144774
144798
  }
144775
144799
 
144776
144800
  unique_ptr<SQLStatement> Transformer::TransformStatement(duckdb_libpgquery::PGNode *stmt) {
package/src/duckdb.hpp CHANGED
@@ -10,8 +10,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
10
10
 
11
11
  #pragma once
12
12
  #define DUCKDB_AMALGAMATION 1
13
- #define DUCKDB_SOURCE_ID "3e3b464ce"
14
- #define DUCKDB_VERSION "0.3.2-dev685"
13
+ #define DUCKDB_SOURCE_ID "18b71004d"
14
+ #define DUCKDB_VERSION "0.3.2-dev706"
15
15
  //===----------------------------------------------------------------------===//
16
16
  // DuckDB
17
17
  //