Skip to content

Commit a481bd8

Browse files
authored
Merge pull request #4 from lmangani/chsql
Rename extension to chsql
2 parents e3024a7 + 35dbb47 commit a481bd8

File tree

9 files changed

+122
-46
lines changed

9 files changed

+122
-46
lines changed

.github/workflows/MainDistributionPipeline.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
#
44
name: Main Extension Distribution Pipeline
55
on:
6-
push:
6+
release:
7+
types: [published]
78
pull_request:
89
workflow_dispatch:
910

@@ -17,7 +18,7 @@ jobs:
1718
uses: duckdb/extension-ci-tools/.github/workflows/_extension_distribution.yml@main
1819
with:
1920
duckdb_version: v1.0.0
20-
extension_name: dynamic_sql_clickhouse
21+
extension_name: chsql
2122

2223
duckdb-stable-deploy:
2324
name: Deploy extension binaries
@@ -26,6 +27,6 @@ jobs:
2627
secrets: inherit
2728
with:
2829
duckdb_version: v1.0.0
29-
extension_name: dynamic_sql_clickhouse
30+
extension_name: chsql
3031
deploy_latest: ${{ startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main' }}
3132
deploy_versioned: ${{ startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main' }}

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cmake_minimum_required(VERSION 3.5)
22

33
# Set extension name here
4-
set(TARGET_NAME dynamic_sql_clickhouse)
4+
set(TARGET_NAME chsql)
55

66
# DuckDB's extension distribution supports vcpkg. As such, dependencies can be added in ./vcpkg.json and then
77
# used in cmake with find_package. Feel free to remove or replace with other dependencies.
@@ -14,7 +14,7 @@ set(LOADABLE_EXTENSION_NAME ${TARGET_NAME}_loadable_extension)
1414
project(${TARGET_NAME})
1515
include_directories(src/include)
1616

17-
set(EXTENSION_SOURCES src/dynamic_sql_clickhouse_extension.cpp src/default_table_functions.cpp)
17+
set(EXTENSION_SOURCES src/chsql_extension.cpp src/default_table_functions.cpp)
1818

1919
build_static_extension(${TARGET_NAME} ${EXTENSION_SOURCES})
2020
build_loadable_extension(${TARGET_NAME} " " ${EXTENSION_SOURCES})

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
PROJ_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
22

33
# Configuration of extension
4-
EXT_NAME=dynamic_sql_clickhouse
4+
EXT_NAME=chsql
55
EXT_CONFIG=${PROJ_DIR}extension_config.cmake
66

77
# Include the Makefile from extension-ci-tools

aliases.sql

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
-- Type conversion macros
2+
CREATE OR REPLACE MACRO toString(expr) AS CAST(expr AS VARCHAR);
3+
CREATE OR REPLACE MACRO toInt8(expr) AS CAST(expr AS INT8);
4+
CREATE OR REPLACE MACRO toInt16(expr) AS CAST(expr AS INT16);
5+
CREATE OR REPLACE MACRO toInt32(expr) AS CAST(expr AS INT32);
6+
CREATE OR REPLACE MACRO toInt64(expr) AS CAST(expr AS INT64);
7+
CREATE OR REPLACE MACRO toInt128(expr) AS CAST(expr AS INT128);
8+
CREATE OR REPLACE MACRO toInt256(expr) AS CAST(expr AS HUGEINT);
9+
-- Type conversion with default values
10+
CREATE OR REPLACE MACRO toInt8OrZero(expr) AS COALESCE(TRY_CAST(expr AS INT8), 0);
11+
CREATE OR REPLACE MACRO toInt16OrZero(expr) AS COALESCE(TRY_CAST(expr AS INT16), 0);
12+
CREATE OR REPLACE MACRO toInt32OrZero(expr) AS COALESCE(TRY_CAST(expr AS INT32), 0);
13+
CREATE OR REPLACE MACRO toInt64OrZero(expr) AS COALESCE(TRY_CAST(expr AS INT64), 0);
14+
CREATE OR REPLACE MACRO toInt128OrZero(expr) AS COALESCE(TRY_CAST(expr AS INT128), 0);
15+
CREATE OR REPLACE MACRO toInt256OrZero(expr) AS COALESCE(TRY_CAST(expr AS HUGEINT), 0);
16+
CREATE OR REPLACE MACRO toInt8OrNull(expr) AS TRY_CAST(expr AS INT8);
17+
CREATE OR REPLACE MACRO toInt16OrNull(expr) AS TRY_CAST(expr AS INT16);
18+
CREATE OR REPLACE MACRO toInt32OrNull(expr) AS TRY_CAST(expr AS INT32);
19+
CREATE OR REPLACE MACRO toInt64OrNull(expr) AS TRY_CAST(expr AS INT64);
20+
CREATE OR REPLACE MACRO toInt128OrNull(expr) AS TRY_CAST(expr AS INT128);
21+
CREATE OR REPLACE MACRO toInt256OrNull(expr) AS TRY_CAST(expr AS HUGEINT);
22+
-- Unsigned integer conversion macros
23+
CREATE OR REPLACE MACRO toUInt8(expr) AS CAST(expr AS UTINYINT);
24+
CREATE OR REPLACE MACRO toUInt16(expr) AS CAST(expr AS USMALLINT);
25+
CREATE OR REPLACE MACRO toUInt32(expr) AS CAST(expr AS UINTEGER);
26+
CREATE OR REPLACE MACRO toUInt64(expr) AS CAST(expr AS UBIGINT);
27+
-- Unsigned integer conversion with default values
28+
CREATE OR REPLACE MACRO toUInt8OrZero(expr) AS COALESCE(TRY_CAST(expr AS UTINYINT), 0);
29+
CREATE OR REPLACE MACRO toUInt16OrZero(expr) AS COALESCE(TRY_CAST(expr AS USMALLINT), 0);
30+
CREATE OR REPLACE MACRO toUInt32OrZero(expr) AS COALESCE(TRY_CAST(expr AS UINTEGER), 0);
31+
CREATE OR REPLACE MACRO toUInt64OrZero(expr) AS COALESCE(TRY_CAST(expr AS UBIGINT), 0);
32+
CREATE OR REPLACE MACRO toUInt8OrNull(expr) AS TRY_CAST(expr AS UTINYINT);
33+
CREATE OR REPLACE MACRO toUInt16OrNull(expr) AS TRY_CAST(expr AS USMALLINT);
34+
CREATE OR REPLACE MACRO toUInt32OrNull(expr) AS TRY_CAST(expr AS UINTEGER);
35+
CREATE OR REPLACE MACRO toUInt64OrNull(expr) AS TRY_CAST(expr AS UBIGINT);
36+
-- Floating-point conversion macros
37+
CREATE OR REPLACE MACRO toFloat(expr) AS CAST(expr AS DOUBLE);
38+
CREATE OR REPLACE MACRO toFloatOrNull(expr) AS TRY_CAST(expr AS DOUBLE);
39+
CREATE OR REPLACE MACRO toFloatOrZero(expr) AS COALESCE(TRY_CAST(expr AS DOUBLE), 0);
40+
-- Arithmetic macros
41+
CREATE OR REPLACE MACRO intDiv(a, b) AS (a / b);
42+
CREATE OR REPLACE MACRO intDivOrZero(a, b) AS COALESCE((a / b), 0);
43+
-- String matching macro
44+
CREATE OR REPLACE MACRO match(string, token) AS (string LIKE token);
45+
-- Array macros
46+
CREATE OR REPLACE MACRO arrayExists(needle, haystack) AS (haystack @> ARRAY[needle]);
47+
CREATE OR REPLACE MACRO arrayMap(e, arr) AS (array_transform(arr, e -> (e * e)));

description.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
extension:
2+
name: chsql
3+
description: Clickhouse SQL Macros for DuckDB
4+
version: 1.0.0
5+
language: C++
6+
build: cmake
7+
license: MIT
8+
maintainers:
9+
- lmangani
10+
11+
repo:
12+
github: lmangani/duckdb-extension-clickhouse-sql
13+
ref: e3024a76df741864696010130f72c79cbad2274d
14+
15+
docs:
16+
hello_world: |
17+
SELECT toString('world') as hello;
18+
extended_description: |
19+
This extension provides a growing number of Clickhouse SQL Macros for DuckDB.
20+

extension_config.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# This file is included by DuckDB's build system. It specifies which extension to load
22

33
# Extension from this repo
4-
duckdb_extension_load(dynamic_sql_clickhouse
4+
duckdb_extension_load(chsql
55
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}
66
LOAD_TESTS
77
)

src/dynamic_sql_clickhouse_extension.cpp renamed to src/chsql_extension.cpp

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#define DUCKDB_EXTENSION_MAIN
22

3-
#include "dynamic_sql_clickhouse_extension.hpp"
3+
#include "chsql_extension.hpp"
44
#include "duckdb.hpp"
55
#include "duckdb/common/exception.hpp"
66
#include "duckdb/common/string_util.hpp"
@@ -28,8 +28,9 @@ namespace duckdb {
2828
// Add the text of your SQL macro as a raw string with the format R"( select 42 )"
2929

3030

31-
static DefaultMacro dynamic_sql_clickhouse_macros[] = {
31+
static DefaultMacro chsql_macros[] = {
3232
{DEFAULT_SCHEMA, "times_two", {"x", nullptr}, R"(x*2)"},
33+
// -- Type conversion macros
3334
{DEFAULT_SCHEMA, "toString", {"x", nullptr}, R"(CAST(x AS VARCHAR))"},
3435
{DEFAULT_SCHEMA, "toInt8", {"x", nullptr}, R"(CAST(x AS INT8))"},
3536
{DEFAULT_SCHEMA, "toInt16", {"x", nullptr}, R"(CAST(x AS INT16))"},
@@ -49,6 +50,7 @@ static DefaultMacro dynamic_sql_clickhouse_macros[] = {
4950
{DEFAULT_SCHEMA, "toInt64OrNull", {"x", nullptr}, R"(TRY_CAST(x AS INT64))"},
5051
{DEFAULT_SCHEMA, "toInt128OrNull", {"x", nullptr}, R"(TRY_CAST(x AS INT128))"},
5152
{DEFAULT_SCHEMA, "toInt256OrNull", {"x", nullptr}, R"(TRY_CAST(x AS HUGEINT))"},
53+
// -- Unsigned integer conversion macros
5254
{DEFAULT_SCHEMA, "toUInt8", {"x", nullptr}, R"(CAST(x AS UTINYINT))"},
5355
{DEFAULT_SCHEMA, "toUInt16", {"x", nullptr}, R"(CAST(x AS USMALLINT))"},
5456
{DEFAULT_SCHEMA, "toUInt32", {"x", nullptr}, R"(CAST(x AS UINTEGER))"},
@@ -61,16 +63,22 @@ static DefaultMacro dynamic_sql_clickhouse_macros[] = {
6163
{DEFAULT_SCHEMA, "toUInt16OrNull", {"x", nullptr}, R"(TRY_CAST(x AS USMALLINT))"}, // And here
6264
{DEFAULT_SCHEMA, "toUInt32OrNull", {"x", nullptr}, R"(TRY_CAST(x AS UINTEGER))"}, // Also here
6365
{DEFAULT_SCHEMA, "toUInt64OrNull", {"x", nullptr}, R"(TRY_CAST(x AS UBIGINT))"}, // And here
66+
// -- Floating-point conversion macros
6467
{DEFAULT_SCHEMA, "toFloat", {"x", nullptr}, R"(CAST(x AS DOUBLE))"},
6568
{DEFAULT_SCHEMA, "toFloatOrNull", {"x", nullptr}, R"(TRY_CAST(x AS DOUBLE))"},
6669
{DEFAULT_SCHEMA, "toFloatOrZero", {"x", nullptr}, R"(CASE WHEN TRY_CAST(x AS DOUBLE) IS NOT NULL THEN CAST(x AS DOUBLE) ELSE 0 END)"},
70+
// -- Arithmetic macros
6771
{DEFAULT_SCHEMA, "intDiv", {"a", "b"}, R"((CAST(a AS BIGINT) / CAST(b AS BIGINT)))"},
72+
// -- String matching macros
6873
{DEFAULT_SCHEMA, "match", {"string", "token"}, R"(string LIKE token)"},
74+
// -- Array macros
75+
{DEFAULT_SCHEMA, "arrayExists", {"needle", "haystack"}, R"(haystack @> ARRAY[needle])"},
76+
{DEFAULT_SCHEMA, "arrayMap", {"e", "arr"}, R"(array_transform(arr, e -> (e * e)))"},
6977
{nullptr, nullptr, {nullptr}, nullptr}};
7078

7179
// To add a new table SQL macro, add a new macro to this array!
72-
// Copy and paste the top item in the array into the
73-
// second-to-last position and make some modifications.
80+
// Copy and paste the top item in the array into the
81+
// second-to-last position and make some modifications.
7482
// (essentially, leave the last entry in the array as {nullptr, nullptr, {nullptr}, nullptr})
7583

7684
// Keep the DEFAULT_SCHEMA (no change needed)
@@ -80,67 +88,67 @@ static DefaultMacro dynamic_sql_clickhouse_macros[] = {
8088
// If your function has parameters with default values, add their names and values in quotes inside of {}'s inside of the {}.
8189
// Be sure to keep {nullptr, nullptr} at the end
8290
// If you do not have parameters with default values, simplify to {nullptr, nullptr}
83-
// Add the text of your SQL macro as a raw string with the format R"( select 42; )"
91+
// Add the text of your SQL macro as a raw string with the format R"( select 42; )"
8492

8593
// clang-format off
86-
static const DefaultTableMacro dynamic_sql_clickhouse_table_macros[] = {
94+
static const DefaultTableMacro chsql_table_macros[] = {
8795
{DEFAULT_SCHEMA, "times_two_table", {"x", nullptr}, {{"two", "2"}, {nullptr, nullptr}}, R"(SELECT x * two as output_column;)"},
8896
{nullptr, nullptr, {nullptr}, {{nullptr, nullptr}}, nullptr}
8997
};
9098
// clang-format on
9199

92-
inline void DynamicSqlClickhouseScalarFun(DataChunk &args, ExpressionState &state, Vector &result) {
100+
inline void ChSqlScalarFun(DataChunk &args, ExpressionState &state, Vector &result) {
93101
auto &name_vector = args.data[0];
94102
UnaryExecutor::Execute<string_t, string_t>(
95103
name_vector, result, args.size(),
96104
[&](string_t name) {
97-
return StringVector::AddString(result, "DynamicSqlClickhouse "+name.GetString()+" 🐥");;
105+
return StringVector::AddString(result, "ChSql "+name.GetString()+" 🐥");;
98106
});
99107
}
100108

101-
inline void DynamicSqlClickhouseOpenSSLVersionScalarFun(DataChunk &args, ExpressionState &state, Vector &result) {
109+
inline void ChSqlOpenSSLVersionScalarFun(DataChunk &args, ExpressionState &state, Vector &result) {
102110
auto &name_vector = args.data[0];
103111
UnaryExecutor::Execute<string_t, string_t>(
104112
name_vector, result, args.size(),
105113
[&](string_t name) {
106-
return StringVector::AddString(result, "DynamicSqlClickhouse " + name.GetString() +
114+
return StringVector::AddString(result, "ChSql " + name.GetString() +
107115
", my linked OpenSSL version is " +
108116
OPENSSL_VERSION_TEXT );;
109117
});
110118
}
111119

112120
static void LoadInternal(DatabaseInstance &instance) {
113121
// Register a scalar function
114-
auto dynamic_sql_clickhouse_scalar_function = ScalarFunction("dynamic_sql_clickhouse", {LogicalType::VARCHAR}, LogicalType::VARCHAR, DynamicSqlClickhouseScalarFun);
115-
ExtensionUtil::RegisterFunction(instance, dynamic_sql_clickhouse_scalar_function);
122+
auto chsql_scalar_function = ScalarFunction("chsql", {LogicalType::VARCHAR}, LogicalType::VARCHAR, ChSqlScalarFun);
123+
ExtensionUtil::RegisterFunction(instance, chsql_scalar_function);
116124

117125
// Register another scalar function
118-
auto dynamic_sql_clickhouse_openssl_version_scalar_function = ScalarFunction("dynamic_sql_clickhouse_openssl_version", {LogicalType::VARCHAR},
119-
LogicalType::VARCHAR, DynamicSqlClickhouseOpenSSLVersionScalarFun);
120-
ExtensionUtil::RegisterFunction(instance, dynamic_sql_clickhouse_openssl_version_scalar_function);
126+
auto chsql_openssl_version_scalar_function = ScalarFunction("chsql_openssl_version", {LogicalType::VARCHAR},
127+
LogicalType::VARCHAR, ChSqlOpenSSLVersionScalarFun);
128+
ExtensionUtil::RegisterFunction(instance, chsql_openssl_version_scalar_function);
121129

122130
// Macros
123-
for (idx_t index = 0; dynamic_sql_clickhouse_macros[index].name != nullptr; index++) {
124-
auto info = DefaultFunctionGenerator::CreateInternalMacroInfo(dynamic_sql_clickhouse_macros[index]);
131+
for (idx_t index = 0; chsql_macros[index].name != nullptr; index++) {
132+
auto info = DefaultFunctionGenerator::CreateInternalMacroInfo(chsql_macros[index]);
125133
ExtensionUtil::RegisterFunction(instance, *info);
126134
}
127135
// Table Macros
128-
for (idx_t index = 0; dynamic_sql_clickhouse_table_macros[index].name != nullptr; index++) {
129-
auto table_info = DefaultTableFunctionGenerator::CreateTableMacroInfo(dynamic_sql_clickhouse_table_macros[index]);
136+
for (idx_t index = 0; chsql_table_macros[index].name != nullptr; index++) {
137+
auto table_info = DefaultTableFunctionGenerator::CreateTableMacroInfo(chsql_table_macros[index]);
130138
ExtensionUtil::RegisterFunction(instance, *table_info);
131139
}
132140
}
133141

134-
void DynamicSqlClickhouseExtension::Load(DuckDB &db) {
142+
void ChsqlExtension::Load(DuckDB &db) {
135143
LoadInternal(*db.instance);
136144
}
137-
std::string DynamicSqlClickhouseExtension::Name() {
138-
return "dynamic_sql_clickhouse";
145+
std::string ChsqlExtension::Name() {
146+
return "chsql";
139147
}
140148

141-
std::string DynamicSqlClickhouseExtension::Version() const {
142-
#ifdef EXT_VERSION_DYNAMIC_SQL_CLICKHOUSE
143-
return EXT_VERSION_DYNAMIC_SQL_CLICKHOUSE;
149+
std::string ChsqlExtension::Version() const {
150+
#ifdef EXT_VERSION_CHSQL
151+
return EXT_VERSION_CHSQL;
144152
#else
145153
return "";
146154
#endif
@@ -150,12 +158,12 @@ std::string DynamicSqlClickhouseExtension::Version() const {
150158

151159
extern "C" {
152160

153-
DUCKDB_EXTENSION_API void dynamic_sql_clickhouse_init(duckdb::DatabaseInstance &db) {
161+
DUCKDB_EXTENSION_API void chsql_init(duckdb::DatabaseInstance &db) {
154162
duckdb::DuckDB db_wrapper(db);
155-
db_wrapper.LoadExtension<duckdb::DynamicSqlClickhouseExtension>();
163+
db_wrapper.LoadExtension<duckdb::ChsqlExtension>();
156164
}
157165

158-
DUCKDB_EXTENSION_API const char *dynamic_sql_clickhouse_version() {
166+
DUCKDB_EXTENSION_API const char *chsql_version() {
159167
return duckdb::DuckDB::LibraryVersion();
160168
}
161169
}

src/include/dynamic_sql_clickhouse_extension.hpp renamed to src/include/chsql_extension.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace duckdb {
66

7-
class DynamicSqlClickhouseExtension : public Extension {
7+
class ChsqlExtension : public Extension {
88
public:
99
void Load(DuckDB &db) override;
1010
std::string Name() override;

test/sql/dynamic_sql_clickhouse.test renamed to test/sql/chsql.test

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
# name: test/sql/dynamic_sql_clickhouse.test
2-
# description: test dynamic_sql_clickhouse extension
3-
# group: [dynamic_sql_clickhouse]
1+
# name: test/sql/chsql.test
2+
# description: test chsql extension
3+
# group: [chsql]
44

55
# Before we load the extension, this will fail
66
statement error
7-
SELECT dynamic_sql_clickhouse('Sam');
7+
SELECT chsql('Sam');
88
----
9-
Catalog Error: Scalar Function with name dynamic_sql_clickhouse does not exist!
9+
Catalog Error: Scalar Function with name chsql does not exist!
1010

1111
# Require statement will ensure this test is run with this extension loaded
12-
require dynamic_sql_clickhouse
12+
require chsql
1313

1414
# Confirm the extension works
1515
query I
16-
SELECT dynamic_sql_clickhouse('Works');
16+
SELECT chsql('Works');
1717
----
18-
DynamicSqlClickhouse Works 🐥
18+
ChSql Works 🐥
1919

2020
query I
21-
SELECT dynamic_sql_clickhouse_openssl_version('Hello');
21+
SELECT chsql_openssl_version('Hello');
2222
----
23-
<REGEX>:.*DynamicSqlClickhouse Hello, my linked OpenSSL version is OpenSSL.*
23+
<REGEX>:.*ChSql Hello, my linked OpenSSL version is OpenSSL.*
2424

2525
query I
2626
SELECT toString('123')

0 commit comments

Comments
 (0)