diff --git a/CMakeLists.txt b/CMakeLists.txt index 71505dc..37003e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,9 +49,8 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) # Create Extension library set(EXTENSION_SOURCES - src/add_numbers.c + src/extension.c src/parser.c - src/capi_quack.c src/tokenizer.cpp ) diff --git a/src/add_numbers.c b/src/add_numbers.c deleted file mode 100644 index 8d5b353..0000000 --- a/src/add_numbers.c +++ /dev/null @@ -1,64 +0,0 @@ -#include "duckdb_extension.h" - -#include "add_numbers.h" - -DUCKDB_EXTENSION_EXTERN - -// Scalar function that adds two numbers together -static void AddNumbersTogether(duckdb_function_info info, duckdb_data_chunk input, duckdb_vector output) { - // get the total number of rows in this chunk - idx_t input_size = duckdb_data_chunk_get_size(input); - // extract the two input vectors - duckdb_vector a = duckdb_data_chunk_get_vector(input, 0); - duckdb_vector b = duckdb_data_chunk_get_vector(input, 1); - // get the data pointers for the input vectors (both int64 as specified by the parameter types) - int64_t* a_data = (int64_t *)duckdb_vector_get_data(a); - int64_t* b_data = (int64_t *)duckdb_vector_get_data(b); - int64_t* result_data = (int64_t *)duckdb_vector_get_data(output); - // get the validity vectors - uint64_t* a_validity = duckdb_vector_get_validity(a); - uint64_t* b_validity = duckdb_vector_get_validity(b); - if (a_validity || b_validity) { - // if either a_validity or b_validity is defined there might be NULL values - duckdb_vector_ensure_validity_writable(output); - uint64_t* result_validity = duckdb_vector_get_validity(output); - for (idx_t row = 0; row < input_size; row++) { - if (duckdb_validity_row_is_valid(a_validity, row) && duckdb_validity_row_is_valid(b_validity, row)) { - // not null - do the addition - result_data[row] = a_data[row] + b_data[row]; - } else { - // either a or b is NULL - set the result row to NULL - duckdb_validity_set_row_invalid(result_validity, row); - } - } - } else { - // no NULL values - iterate and do the operation directly - for (idx_t row = 0; row < input_size; row++) { - result_data[row] = a_data[row] * b_data[row]; - } - } -} - -// Register the AddNumbersFunction -void RegisterAddNumbersFunction(duckdb_connection connection) { - // create a scalar function - duckdb_scalar_function function = duckdb_create_scalar_function(); - duckdb_scalar_function_set_name(function, "multiply_numbers_together"); - - // add a two bigint parameters - duckdb_logical_type type = duckdb_create_logical_type(DUCKDB_TYPE_BIGINT); - duckdb_scalar_function_add_parameter(function, type); - duckdb_scalar_function_add_parameter(function, type); - - // set the return type to bigint - duckdb_scalar_function_set_return_type(function, type); - - duckdb_destroy_logical_type(&type); - - // set up the function - duckdb_scalar_function_set_function(function, AddNumbersTogether); - - // register and cleanup - duckdb_register_scalar_function(connection, function); - duckdb_destroy_scalar_function(&function); -} diff --git a/src/capi_quack.c b/src/extension.c similarity index 56% rename from src/capi_quack.c rename to src/extension.c index b3ed522..c98b381 100644 --- a/src/capi_quack.c +++ b/src/extension.c @@ -1,15 +1,7 @@ #include "duckdb_extension.h" - -#include "add_numbers.h" #include "parser.h" DUCKDB_EXTENSION_ENTRYPOINT(duckdb_connection connection, duckdb_extension_info info, struct duckdb_extension_access *access) { - // Register demo function - RegisterAddNumbersFunction(connection); - - // Register parser functions RegisterParserFunctions(connection); - - // Return true to indicate successful initialization return true; } diff --git a/src/include/add_numbers.h b/src/include/add_numbers.h deleted file mode 100644 index c93430f..0000000 --- a/src/include/add_numbers.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include "duckdb_extension.h" - -void RegisterAddNumbersFunction(duckdb_connection connection); diff --git a/test/sql/parser.test b/test/sql/parser.test index faf6bd7..6f82535 100644 --- a/test/sql/parser.test +++ b/test/sql/parser.test @@ -2,21 +2,8 @@ # description: test parser extension functions # group: [parser] -# Before we load the extension, this will fail -statement error -SELECT multiply_numbers_together(1,2); ----- -Catalog Error: Scalar Function with name multiply_numbers_together does not exist! - -# Require statement will ensure the extension is loaded from now on require capi_quack -# Confirm the extension works -query I -SELECT multiply_numbers_together(5,10) ----- -50 - # ============================================================================= # SCALAR FUNCTIONS # ============================================================================= @@ -135,29 +122,29 @@ SELECT 'not--comment' # parse_table_names(query) -> VARCHAR[] # ----------------------------------------------------------------------------- -query I -SELECT len(parse_table_names('SELECT 1')) +query T +SELECT parse_table_names('SELECT 1') ---- -0 +[] # ----------------------------------------------------------------------------- # parse_function_names(query) -> VARCHAR[] # ----------------------------------------------------------------------------- query I -SELECT len(parse_function_names('SELECT UPPER(''x''), LENGTH(''y'')')) +SELECT list_sort(parse_function_names('SELECT UPPER(''x''), LENGTH(''y'')')) ---- -2 +[length, upper] query I -SELECT len(parse_function_names('SELECT COUNT(*), SUM(1)')) +SELECT list_sort(parse_function_names('SELECT COUNT(*), SUM(1)')) ---- -2 +[count_star, sum] -query I -SELECT len(parse_function_names('SELECT 1')) +query T +SELECT parse_function_names('SELECT 1') ---- -0 +[] # ----------------------------------------------------------------------------- # sql_parse_json(query) -> VARCHAR (JSON) @@ -186,15 +173,20 @@ SELECT COUNT(*) > 50 FROM sql_keywords() ---- true -query I -SELECT COUNT(*) FROM sql_keywords() WHERE keyword = 'SELECT' +query T +SELECT keyword FROM sql_keywords() WHERE keyword = 'SELECT' ---- -1 +SELECT -query I -SELECT COUNT(*) FROM sql_keywords() WHERE keyword = 'FROM' +query T +SELECT keyword FROM sql_keywords() WHERE keyword = 'FROM' ---- -1 +FROM + +query T +SELECT keyword FROM sql_keywords() WHERE keyword = 'WHERE' +---- +WHERE # ----------------------------------------------------------------------------- # parse_statements(query) -> table(stmt_index, stmt_type, error, param_count) @@ -205,10 +197,11 @@ SELECT * FROM parse_statements('SELECT 1') ---- 0 SELECT NULL 0 -query I -SELECT COUNT(*) FROM parse_statements('SELECT 1; SELECT 2') +query IT +SELECT stmt_index, stmt_type FROM parse_statements('SELECT 1; SELECT 2') ORDER BY stmt_index ---- -2 +0 SELECT +1 SELECT query T SELECT stmt_type FROM parse_statements('CREATE TABLE t(x INT)') @@ -239,10 +232,11 @@ true # parse_parameters(query, stmt_index) -> table(param_index, param_name, param_type) # ----------------------------------------------------------------------------- -query I -SELECT COUNT(*) FROM parse_parameters('SELECT $1, $2', 0) +query IT +SELECT param_index, param_name FROM parse_parameters('SELECT $1, $2', 0) ORDER BY param_index ---- -2 +0 1 +1 2 query I SELECT COUNT(*) FROM parse_parameters('SELECT 1', 0) @@ -259,10 +253,14 @@ SELECT * FROM parse_columns('SELECT 1 AS num, ''hello'' AS str', 0) 0 num INTEGER 1 str VARCHAR -query I -SELECT COUNT(*) FROM parse_columns('SELECT 1, 2, 3, 4, 5', 0) +query IT +SELECT col_index, col_type FROM parse_columns('SELECT 1, 2, 3, 4, 5', 0) ORDER BY col_index ---- -5 +0 INTEGER +1 INTEGER +2 INTEGER +3 INTEGER +4 INTEGER # ----------------------------------------------------------------------------- # parse_column_types(query, stmt_index) -> table(col_index, col_name, base_type, full_type) @@ -370,10 +368,11 @@ SELECT operator, value FROM parse_where('SELECT 1 WHERE 1 > 0') ---- > 0 -query I -SELECT COUNT(*) FROM parse_where('SELECT 1 WHERE 5 = 5 AND 10 < 20') +query TT +SELECT operator, value FROM parse_where('SELECT 1 WHERE 5 = 5 AND 10 < 20') ORDER BY value ---- -2 +< 20 += 5 query I SELECT COUNT(*) FROM parse_where('SELECT 1')