duckdb 0.3.2-dev950.0 → 0.3.2-dev962.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-dev950.0",
4
+ "version": "0.3.2-dev962.0",
5
5
  "description": "DuckDB node.js API",
6
6
  "gypfile": true,
7
7
  "dependencies": {
package/src/duckdb.cpp CHANGED
@@ -19364,14 +19364,14 @@ static bool IntegerCastLoop(const char *buf, idx_t len, T &result, bool strict)
19364
19364
  if (pos >= len) {
19365
19365
  return false;
19366
19366
  }
19367
- int64_t exponent = 0;
19367
+ int32_t exponent = 0;
19368
19368
  int negative = buf[pos] == '-';
19369
19369
  if (negative) {
19370
- if (!IntegerCastLoop<int64_t, true, false>(buf + pos, len - pos, exponent, strict)) {
19370
+ if (!IntegerCastLoop<int32_t, true, false>(buf + pos, len - pos, exponent, strict)) {
19371
19371
  return false;
19372
19372
  }
19373
19373
  } else {
19374
- if (!IntegerCastLoop<int64_t, false, false>(buf + pos, len - pos, exponent, strict)) {
19374
+ if (!IntegerCastLoop<int32_t, false, false>(buf + pos, len - pos, exponent, strict)) {
19375
19375
  return false;
19376
19376
  }
19377
19377
  }
@@ -91590,6 +91590,10 @@ struct DuckDBFunctionsFun {
91590
91590
  static void RegisterFunction(BuiltinFunctions &set);
91591
91591
  };
91592
91592
 
91593
+ struct DuckDBKeywordsFun {
91594
+ static void RegisterFunction(BuiltinFunctions &set);
91595
+ };
91596
+
91593
91597
  struct DuckDBIndexesFun {
91594
91598
  static void RegisterFunction(BuiltinFunctions &set);
91595
91599
  };
@@ -93771,6 +93775,90 @@ void DuckDBIndexesFun::RegisterFunction(BuiltinFunctions &set) {
93771
93775
 
93772
93776
 
93773
93777
 
93778
+ namespace duckdb {
93779
+
93780
+ struct DuckDBKeywordsData : public FunctionOperatorData {
93781
+ DuckDBKeywordsData() : offset(0) {
93782
+ }
93783
+
93784
+ vector<ParserKeyword> entries;
93785
+ idx_t offset;
93786
+ };
93787
+
93788
+ static unique_ptr<FunctionData> DuckDBKeywordsBind(ClientContext &context, vector<Value> &inputs,
93789
+ unordered_map<string, Value> &named_parameters,
93790
+ vector<LogicalType> &input_table_types,
93791
+ vector<string> &input_table_names, vector<LogicalType> &return_types,
93792
+ vector<string> &names) {
93793
+ names.emplace_back("keyword_name");
93794
+ return_types.emplace_back(LogicalType::VARCHAR);
93795
+
93796
+ names.emplace_back("keyword_category");
93797
+ return_types.emplace_back(LogicalType::VARCHAR);
93798
+
93799
+ return nullptr;
93800
+ }
93801
+
93802
+ unique_ptr<FunctionOperatorData> DuckDBKeywordsInit(ClientContext &context, const FunctionData *bind_data,
93803
+ const vector<column_t> &column_ids,
93804
+ TableFilterCollection *filters) {
93805
+ auto result = make_unique<DuckDBKeywordsData>();
93806
+ result->entries = Parser::KeywordList();
93807
+ return move(result);
93808
+ }
93809
+
93810
+ void DuckDBKeywordsFunction(ClientContext &context, const FunctionData *bind_data, FunctionOperatorData *operator_state,
93811
+ DataChunk *input, DataChunk &output) {
93812
+ auto &data = (DuckDBKeywordsData &)*operator_state;
93813
+ if (data.offset >= data.entries.size()) {
93814
+ // finished returning values
93815
+ return;
93816
+ }
93817
+ // start returning values
93818
+ // either fill up the chunk or return all the remaining columns
93819
+ idx_t count = 0;
93820
+ while (data.offset < data.entries.size() && count < STANDARD_VECTOR_SIZE) {
93821
+ auto &entry = data.entries[data.offset++];
93822
+
93823
+ // keyword_name, VARCHAR
93824
+ output.SetValue(0, count, Value(entry.name));
93825
+ // keyword_category, VARCHAR
93826
+ string category_name;
93827
+ switch (entry.category) {
93828
+ case KeywordCategory::KEYWORD_RESERVED:
93829
+ category_name = "reserved";
93830
+ break;
93831
+ case KeywordCategory::KEYWORD_UNRESERVED:
93832
+ category_name = "unreserved";
93833
+ break;
93834
+ case KeywordCategory::KEYWORD_TYPE_FUNC:
93835
+ category_name = "type_function";
93836
+ break;
93837
+ case KeywordCategory::KEYWORD_COL_NAME:
93838
+ category_name = "column_name";
93839
+ break;
93840
+ default:
93841
+ throw InternalException("Unrecognized keyword category");
93842
+ }
93843
+ output.SetValue(1, count, Value(move(category_name)));
93844
+
93845
+ count++;
93846
+ }
93847
+ output.SetCardinality(count);
93848
+ }
93849
+
93850
+ void DuckDBKeywordsFun::RegisterFunction(BuiltinFunctions &set) {
93851
+ set.AddFunction(
93852
+ TableFunction("duckdb_keywords", {}, DuckDBKeywordsFunction, DuckDBKeywordsBind, DuckDBKeywordsInit));
93853
+ }
93854
+
93855
+ } // namespace duckdb
93856
+
93857
+
93858
+
93859
+
93860
+
93861
+
93774
93862
 
93775
93863
  namespace duckdb {
93776
93864
 
@@ -95461,6 +95549,7 @@ void BuiltinFunctions::RegisterSQLiteFunctions() {
95461
95549
  DuckDBColumnsFun::RegisterFunction(*this);
95462
95550
  DuckDBConstraintsFun::RegisterFunction(*this);
95463
95551
  DuckDBFunctionsFun::RegisterFunction(*this);
95552
+ DuckDBKeywordsFun::RegisterFunction(*this);
95464
95553
  DuckDBIndexesFun::RegisterFunction(*this);
95465
95554
  DuckDBSchemasFun::RegisterFunction(*this);
95466
95555
  DuckDBDependenciesFun::RegisterFunction(*this);
@@ -134906,6 +134995,7 @@ private:
134906
134995
 
134907
134996
 
134908
134997
  #include <cstdint>
134998
+ #include <string>
134909
134999
 
134910
135000
  namespace duckdb_libpgquery {
134911
135001
 
@@ -134923,6 +135013,18 @@ struct PGSimplifiedToken {
134923
135013
  int32_t start;
134924
135014
  };
134925
135015
 
135016
+ enum class PGKeywordCategory : uint8_t {
135017
+ PG_KEYWORD_RESERVED,
135018
+ PG_KEYWORD_UNRESERVED,
135019
+ PG_KEYWORD_TYPE_FUNC,
135020
+ PG_KEYWORD_COL_NAME
135021
+ };
135022
+
135023
+ struct PGKeyword {
135024
+ std::string text;
135025
+ PGKeywordCategory category;
135026
+ };
135027
+
134926
135028
  }
134927
135029
 
134928
135030
 
@@ -134944,6 +135046,7 @@ public:
134944
135046
  static std::vector<duckdb_libpgquery::PGSimplifiedToken> Tokenize(const std::string &query);
134945
135047
 
134946
135048
  static bool IsKeyword(const std::string &text);
135049
+ static std::vector<duckdb_libpgquery::PGKeyword> KeywordList();
134947
135050
  };
134948
135051
  }
134949
135052
 
@@ -134990,6 +135093,7 @@ typedef enum PGBackslashQuoteType {
134990
135093
  PGList *raw_parser(const char *str);
134991
135094
 
134992
135095
  bool is_keyword(const char *str);
135096
+ std::vector<PGKeyword> keyword_list();
134993
135097
 
134994
135098
  std::vector<PGSimplifiedToken> tokenize(const char *str);
134995
135099
 
@@ -135065,6 +135169,8 @@ vector<SimplifiedToken> Parser::Tokenize(const string &query) {
135065
135169
  case duckdb_libpgquery::PGSimplifiedTokenType::PG_SIMPLIFIED_TOKEN_COMMENT: // LCOV_EXCL_START
135066
135170
  token.type = SimplifiedTokenType::SIMPLIFIED_TOKEN_COMMENT;
135067
135171
  break;
135172
+ default:
135173
+ throw InternalException("Unrecognized token category");
135068
135174
  } // LCOV_EXCL_STOP
135069
135175
  token.start = pg_token.start;
135070
135176
  result.push_back(token);
@@ -135076,6 +135182,33 @@ bool Parser::IsKeyword(const string &text) {
135076
135182
  return PostgresParser::IsKeyword(text);
135077
135183
  }
135078
135184
 
135185
+ vector<ParserKeyword> Parser::KeywordList() {
135186
+ auto keywords = PostgresParser::KeywordList();
135187
+ vector<ParserKeyword> result;
135188
+ for (auto &kw : keywords) {
135189
+ ParserKeyword res;
135190
+ res.name = kw.text;
135191
+ switch (kw.category) {
135192
+ case duckdb_libpgquery::PGKeywordCategory::PG_KEYWORD_RESERVED:
135193
+ res.category = KeywordCategory::KEYWORD_RESERVED;
135194
+ break;
135195
+ case duckdb_libpgquery::PGKeywordCategory::PG_KEYWORD_UNRESERVED:
135196
+ res.category = KeywordCategory::KEYWORD_UNRESERVED;
135197
+ break;
135198
+ case duckdb_libpgquery::PGKeywordCategory::PG_KEYWORD_TYPE_FUNC:
135199
+ res.category = KeywordCategory::KEYWORD_TYPE_FUNC;
135200
+ break;
135201
+ case duckdb_libpgquery::PGKeywordCategory::PG_KEYWORD_COL_NAME:
135202
+ res.category = KeywordCategory::KEYWORD_COL_NAME;
135203
+ break;
135204
+ default:
135205
+ throw InternalException("Unrecognized keyword category");
135206
+ }
135207
+ result.push_back(res);
135208
+ }
135209
+ return result;
135210
+ }
135211
+
135079
135212
  vector<unique_ptr<ParsedExpression>> Parser::ParseExpressionList(const string &select_list) {
135080
135213
  // construct a mock query prefixed with SELECT
135081
135214
  string mock_query = "SELECT " + select_list;
@@ -139161,6 +139294,7 @@ void Transformer::AddGroupByExpression(unique_ptr<ParsedExpression> expression,
139161
139294
 
139162
139295
  static void AddCubeSets(const GroupingSet &current_set, vector<GroupingSet> &result_set,
139163
139296
  vector<GroupingSet> &result_sets, idx_t start_idx = 0) {
139297
+ CheckGroupingSetMax(result_sets.size());
139164
139298
  result_sets.push_back(current_set);
139165
139299
  for (idx_t k = start_idx; k < result_set.size(); k++) {
139166
139300
  auto child_set = current_set;
@@ -139383,6 +139517,8 @@ LogicalType Transformer::TransformTypeName(duckdb_libpgquery::PGTypeName *type_n
139383
139517
  if (type_name->type != duckdb_libpgquery::T_PGTypeName) {
139384
139518
  throw ParserException("Expected a type");
139385
139519
  }
139520
+ auto stack_checker = StackCheck();
139521
+
139386
139522
  auto name = (reinterpret_cast<duckdb_libpgquery::PGValue *>(type_name->names->tail->data.ptr_value)->val.str);
139387
139523
  // transform it to the SQL type
139388
139524
  LogicalTypeId base_type = TransformStringToLogicalType(name);
@@ -139511,8 +139647,10 @@ LogicalType Transformer::TransformTypeName(duckdb_libpgquery::PGTypeName *type_n
139511
139647
  }
139512
139648
  if (type_name->arrayBounds) {
139513
139649
  // array bounds: turn the type into a list
139650
+ idx_t extra_stack = 0;
139514
139651
  for (auto cell = type_name->arrayBounds->head; cell != nullptr; cell = cell->next) {
139515
139652
  result_type = LogicalType::LIST(move(result_type));
139653
+ StackCheck(extra_stack++);
139516
139654
  }
139517
139655
  }
139518
139656
  return result_type;
@@ -139748,8 +139886,14 @@ unique_ptr<CopyStatement> Transformer::TransformCopy(duckdb_libpgquery::PGNode *
139748
139886
  auto &info = *result->info;
139749
139887
 
139750
139888
  // get file_path and is_from
139751
- info.file_path = stmt->filename;
139752
139889
  info.is_from = stmt->is_from;
139890
+ if (!stmt->filename) {
139891
+ // stdin/stdout
139892
+ info.file_path = info.is_from ? "/dev/stdin" : "/dev/stdout";
139893
+ } else {
139894
+ // copy to a file
139895
+ info.file_path = stmt->filename;
139896
+ }
139753
139897
  if (StringUtil::EndsWith(info.file_path, ".parquet")) {
139754
139898
  info.format = "parquet";
139755
139899
  } else {
@@ -222089,6 +222233,10 @@ bool PostgresParser::IsKeyword(const std::string &text) {
222089
222233
  return duckdb_libpgquery::is_keyword(text.c_str());
222090
222234
  }
222091
222235
 
222236
+ vector<duckdb_libpgquery::PGKeyword> PostgresParser::KeywordList() {
222237
+ return duckdb_libpgquery::keyword_list();
222238
+ }
222239
+
222092
222240
  }
222093
222241
 
222094
222242
 
@@ -250871,6 +251019,30 @@ bool is_keyword(const char *text) {
250871
251019
  return ScanKeywordLookup(text, ScanKeywords, NumScanKeywords) != NULL;
250872
251020
  }
250873
251021
 
251022
+ std::vector<PGKeyword> keyword_list() {
251023
+ std::vector<PGKeyword> result;
251024
+ for(size_t i = 0; i < NumScanKeywords; i++) {
251025
+ PGKeyword keyword;
251026
+ keyword.text = ScanKeywords[i].name;
251027
+ switch(ScanKeywords[i].category) {
251028
+ case UNRESERVED_KEYWORD:
251029
+ keyword.category = PGKeywordCategory::PG_KEYWORD_UNRESERVED;
251030
+ break;
251031
+ case RESERVED_KEYWORD:
251032
+ keyword.category = PGKeywordCategory::PG_KEYWORD_RESERVED;
251033
+ break;
251034
+ case TYPE_FUNC_NAME_KEYWORD:
251035
+ keyword.category = PGKeywordCategory::PG_KEYWORD_TYPE_FUNC;
251036
+ break;
251037
+ case COL_NAME_KEYWORD:
251038
+ keyword.category = PGKeywordCategory::PG_KEYWORD_COL_NAME;
251039
+ break;
251040
+ }
251041
+ result.push_back(keyword);
251042
+ }
251043
+ return result;
251044
+ }
251045
+
250874
251046
  std::vector<PGSimplifiedToken> tokenize(const char *str) {
250875
251047
  core_yyscan_t yyscanner;
250876
251048
  base_yy_extra_type yyextra;
package/src/duckdb.hpp CHANGED
@@ -11,8 +11,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
11
11
  #pragma once
12
12
  #define DUCKDB_AMALGAMATION 1
13
13
  #define DUCKDB_AMALGAMATION_EXTENDED 1
14
- #define DUCKDB_SOURCE_ID "27536134b"
15
- #define DUCKDB_VERSION "0.3.2-dev950"
14
+ #define DUCKDB_SOURCE_ID "06f1cfb50"
15
+ #define DUCKDB_VERSION "0.3.2-dev962"
16
16
  //===----------------------------------------------------------------------===//
17
17
  // DuckDB
18
18
  //
@@ -19831,6 +19831,13 @@ struct SimplifiedToken {
19831
19831
  idx_t start;
19832
19832
  };
19833
19833
 
19834
+ enum class KeywordCategory : uint8_t { KEYWORD_RESERVED, KEYWORD_UNRESERVED, KEYWORD_TYPE_FUNC, KEYWORD_COL_NAME };
19835
+
19836
+ struct ParserKeyword {
19837
+ string name;
19838
+ KeywordCategory category;
19839
+ };
19840
+
19834
19841
  } // namespace duckdb
19835
19842
 
19836
19843
 
@@ -19848,6 +19855,10 @@ class Parser {
19848
19855
  public:
19849
19856
  Parser();
19850
19857
 
19858
+ //! The parsed SQL statements from an invocation to ParseQuery.
19859
+ vector<unique_ptr<SQLStatement>> statements;
19860
+
19861
+ public:
19851
19862
  //! Attempts to parse a query into a series of SQL statements. Returns
19852
19863
  //! whether or not the parsing was successful. If the parsing was
19853
19864
  //! successful, the parsed statements will be stored in the statements
@@ -19859,6 +19870,8 @@ public:
19859
19870
 
19860
19871
  //! Returns true if the given text matches a keyword of the parser
19861
19872
  static bool IsKeyword(const string &text);
19873
+ //! Returns a list of all keywords in the parser
19874
+ static vector<ParserKeyword> KeywordList();
19862
19875
 
19863
19876
  //! Parses a list of expressions (i.e. the list found in a SELECT clause)
19864
19877
  static vector<unique_ptr<ParsedExpression>> ParseExpressionList(const string &select_list);
@@ -19871,15 +19884,6 @@ public:
19871
19884
  static vector<vector<unique_ptr<ParsedExpression>>> ParseValuesList(const string &value_list);
19872
19885
  //! Parses a column list (i.e. as found in a CREATE TABLE statement)
19873
19886
  static vector<ColumnDefinition> ParseColumnList(const string &column_list);
19874
-
19875
- //! The parsed SQL statements from an invocation to ParseQuery.
19876
- vector<unique_ptr<SQLStatement>> statements;
19877
-
19878
- private:
19879
- //! Transform a Postgres parse tree into a set of SQL Statements
19880
- bool TransformList(duckdb_libpgquery::PGList *tree);
19881
- //! Transform a single Postgres parse node into a SQL Statement.
19882
- unique_ptr<SQLStatement> TransformNode(duckdb_libpgquery::PGNode *stmt);
19883
19887
  };
19884
19888
  } // namespace duckdb
19885
19889
  //===----------------------------------------------------------------------===//