Skip to content

Commit

Permalink
add JSON type support
Browse files Browse the repository at this point in the history
  • Loading branch information
Tishj committed May 22, 2024
1 parent 86352d8 commit dfdf769
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 10 deletions.
9 changes: 8 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,14 @@ third_party/duckdb/Makefile:
git submodule update --init --recursive

third_party/duckdb/build/$(QUACK_BUILD_DUCKDB)/src/$(DUCKDB_LIB):
$(MAKE) -C third_party/duckdb $(QUACK_BUILD_DUCKDB) DISABLE_SANITIZER=1 ENABLE_UBSAN=0 BUILD_UNITTESTS=OFF BUILD_HTTPFS=1 CMAKE_EXPORT_COMPILE_COMMANDS=1
$(MAKE) -C third_party/duckdb \
$(QUACK_BUILD_DUCKDB) \
DISABLE_SANITIZER=1 \
ENABLE_UBSAN=0 \
BUILD_UNITTESTS=OFF \
BUILD_HTTPFS=1 \
BUILD_JSON=1 \
CMAKE_EXPORT_COMPILE_COMMANDS=1

install_duckdb:
$(install_bin) -m 755 third_party/duckdb/build/$(QUACK_BUILD_DUCKDB)/src/$(DUCKDB_LIB) $(DESTDIR)$(PG_LIB)
Expand Down
2 changes: 1 addition & 1 deletion include/quack/quack_types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ constexpr int32_t QUACK_DUCK_DATE_OFFSET = 10957;
constexpr int64_t QUACK_DUCK_TIMESTAMP_OFFSET = INT64CONST(10957) * USECS_PER_DAY;

duckdb::LogicalType ConvertPostgresToDuckColumnType(Oid type, int32_t typmod);
Oid GetPostgresDuckDBType(duckdb::LogicalTypeId type);
Oid GetPostgresDuckDBType(duckdb::LogicalType type);
void ConvertPostgresToDuckValue(Datum value, duckdb::Vector &result, idx_t offset);
void ConvertDuckToPostgresValue(TupleTableSlot *slot, duckdb::Value &value, idx_t col);
void InsertTupleIntoChunk(duckdb::DataChunk &output, PostgresHeapSeqScanThreadInfo &threadScanInfo,
Expand Down
13 changes: 12 additions & 1 deletion sql/type_support.sql
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,16 @@ INSERT INTO uuid_tbl SELECT CAST(a as UUID) FROM (VALUES
) t(a);
SELECT * FROM uuid_tbl;

-- JSON
CREATE TABLE json_tbl(a JSON);
INSERT INTO json_tbl SELECT CAST(a as JSON) FROM (VALUES
('{"key1": "value1", "key2": "value2"}'),
('["item1", "item2", "item3"]'),
(NULL),
('{}')
) t(a);
SELECT * FROM json_tbl;

DROP TABLE chr;
DROP TABLE small;
DROP TABLE intgr;
Expand All @@ -131,4 +141,5 @@ DROP TABLE smallint_numeric;
DROP TABLE integer_numeric;
DROP TABLE bigint_numeric;
DROP TABLE hugeint_numeric;
DROP TABLE uuid_tbl;
DROP TABLE uuid_tbl;
DROP TABLE json_tbl;
2 changes: 1 addition & 1 deletion src/quack_planner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ quack_create_plan(Query *parse, const char *query) {

for (auto i = 0; i < preparedResultTypes.size(); i++) {
auto &column = preparedResultTypes[i];
Oid postgresColumnOid = quack::GetPostgresDuckDBType(column.id());
Oid postgresColumnOid = quack::GetPostgresDuckDBType(column);

if (OidIsValid(postgresColumnOid)) {
HeapTuple tp;
Expand Down
24 changes: 18 additions & 6 deletions src/quack_types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ ConvertDuckToPostgresValue(TupleTableSlot *slot, duckdb::Value &value, idx_t col
break;
case BPCHAROID:
case TEXTOID:
case JSONOID:
case VARCHAROID: {
auto str = value.GetValue<duckdb::string>();
auto varchar = str.c_str();
Expand Down Expand Up @@ -264,14 +265,17 @@ ConvertPostgresToDuckColumnType(Oid type, int32_t typmod) {
}
case UUIDOID:
return duckdb::LogicalTypeId::UUID;
case JSONOID:
return duckdb::LogicalType::JSON();
default:
elog(ERROR, "(DuckDB/ConvertPostgresToDuckColumnType) Unsupported quack type: %d", type);
}
}

Oid
GetPostgresDuckDBType(duckdb::LogicalTypeId type) {
switch (type) {
GetPostgresDuckDBType(duckdb::LogicalType type) {
auto id = type.id();
switch (id) {
case duckdb::LogicalTypeId::BOOLEAN:
return BOOLOID;
case duckdb::LogicalTypeId::TINYINT:
Expand All @@ -284,8 +288,12 @@ GetPostgresDuckDBType(duckdb::LogicalTypeId type) {
return INT8OID;
case duckdb::LogicalTypeId::HUGEINT:
return NUMERICOID;
case duckdb::LogicalTypeId::VARCHAR:
case duckdb::LogicalTypeId::VARCHAR: {
if (type.IsJSONType()) {
return JSONOID;
}
return VARCHAROID;
}
case duckdb::LogicalTypeId::DATE:
return DATEOID;
case duckdb::LogicalTypeId::TIMESTAMP:
Expand All @@ -299,8 +307,10 @@ GetPostgresDuckDBType(duckdb::LogicalTypeId type) {
}
case duckdb::LogicalTypeId::UUID:
return UUIDOID;
default:
elog(ERROR, "(DuckDB/GetPostgresDuckDBType) Unsupported quack type: %d", static_cast<int>(type));
default: {
elog(ERROR, "(DuckDB/GetPostgresDuckDBType) Unsupported quack type: %s", type.ToString().c_str());
break;
}
}
}

Expand Down Expand Up @@ -405,9 +415,11 @@ ConvertPostgresToDuckValue(Datum value, duckdb::Vector &result, idx_t offset) {
case duckdb::LogicalTypeId::BIGINT:
Append<int64_t>(result, DatumGetInt64(value), offset);
break;
case duckdb::LogicalTypeId::VARCHAR:
case duckdb::LogicalTypeId::VARCHAR: {
// NOTE: This also handles JSON
AppendString(result, value, offset);
break;
}
case duckdb::LogicalTypeId::DATE:
Append<duckdb::date_t>(result, duckdb::date_t(static_cast<int32_t>(value + QUACK_DUCK_DATE_OFFSET)), offset);
break;
Expand Down

0 comments on commit dfdf769

Please sign in to comment.