Skip to content

Commit 240d9ea

Browse files
authored
Merge branch 'duckdblabs:main' into sink_schema
2 parents d0fbd33 + 41ca319 commit 240d9ea

File tree

5 files changed

+119
-72
lines changed

5 files changed

+119
-72
lines changed

CMakeLists.txt

+77-67
Original file line numberDiff line numberDiff line change
@@ -5,83 +5,91 @@ project(${TARGET_NAME})
55
add_definitions(-DFRONTEND=1 -D_GNU_SOURCE=1)
66

77
if(NOT MSVC)
8-
set(POSTGRES_SCANNER_EXTRA_CFLAGS "-Wno-pedantic -Wno-sign-compare -Wno-unused-variable")
8+
set(POSTGRES_SCANNER_EXTRA_CFLAGS
9+
"-Wno-pedantic -Wno-sign-compare -Wno-unused-variable")
910
endif()
1011

11-
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${POSTGRES_SCANNER_EXTRA_CFLAGS}")
12-
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${POSTGRES_SCANNER_EXTRA_CFLAGS}")
13-
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${POSTGRES_SCANNER_EXTRA_CFLAGS}")
12+
set(CMAKE_CXX_FLAGS_DEBUG
13+
"${CMAKE_CXX_FLAGS_DEBUG} ${POSTGRES_SCANNER_EXTRA_CFLAGS}")
14+
set(CMAKE_CXX_FLAGS_RELEASE
15+
"${CMAKE_CXX_FLAGS_RELEASE} ${POSTGRES_SCANNER_EXTRA_CFLAGS}")
16+
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
17+
"${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${POSTGRES_SCANNER_EXTRA_CFLAGS}")
1418

15-
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${POSTGRES_SCANNER_EXTRA_CFLAGS} ${POSTGRES_SCANNER_EXTRA_CFLAGS}")
16-
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${POSTGRES_SCANNER_EXTRA_CFLAGS}")
17-
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} ${POSTGRES_SCANNER_EXTRA_CFLAGS}")
19+
set(CMAKE_C_FLAGS_DEBUG
20+
"${CMAKE_C_FLAGS_DEBUG} ${POSTGRES_SCANNER_EXTRA_CFLAGS} ${POSTGRES_SCANNER_EXTRA_CFLAGS}"
21+
)
22+
set(CMAKE_C_FLAGS_RELEASE
23+
"${CMAKE_C_FLAGS_RELEASE} ${POSTGRES_SCANNER_EXTRA_CFLAGS}")
24+
set(CMAKE_C_FLAGS_RELWITHDEBINFO
25+
"${CMAKE_C_FLAGS_RELWITHDEBINFO} ${POSTGRES_SCANNER_EXTRA_CFLAGS}")
1826

1927
include_directories(include postgres/src/include postgres/src/backend
20-
postgres/src/interfaces/libpq)
28+
postgres/src/interfaces/libpq)
2129

2230
if(WIN32)
2331
include_directories(postgres/src/include/port/win32 postgres/src/port
24-
postgres/src/include/port/win32_msvc)
32+
postgres/src/include/port/win32_msvc)
2533
endif()
2634

2735
set(LIBPG_SOURCES
28-
postgres/src/common/base64.c
29-
postgres/src/common/cryptohash.c
30-
postgres/src/common/encnames.c
31-
postgres/src/common/hmac.c
32-
postgres/src/common/ip.c
33-
postgres/src/common/link-canary.c
34-
postgres/src/common/md5.c
35-
postgres/src/common/md5_common.c
36-
postgres/src/common/saslprep.c
37-
postgres/src/common/scram-common.c
38-
postgres/src/common/sha1.c
39-
postgres/src/common/sha2.c
40-
postgres/src/common/string.c
41-
postgres/src/common/unicode_norm.c
42-
postgres/src/common/wchar.c
43-
postgres/src/interfaces/libpq/fe-auth-scram.c
44-
postgres/src/interfaces/libpq/fe-auth.c
45-
postgres/src/interfaces/libpq/fe-connect.c
46-
postgres/src/interfaces/libpq/fe-exec.c
47-
postgres/src/interfaces/libpq/fe-lobj.c
48-
postgres/src/interfaces/libpq/fe-misc.c
49-
postgres/src/interfaces/libpq/fe-print.c
50-
postgres/src/interfaces/libpq/fe-protocol3.c
51-
postgres/src/interfaces/libpq/fe-secure.c
52-
postgres/src/interfaces/libpq/fe-trace.c
53-
postgres/src/interfaces/libpq/legacy-pqsignal.c
54-
postgres/src/interfaces/libpq/libpq-events.c
55-
postgres/src/interfaces/libpq/pqexpbuffer.c
56-
postgres/src/port/chklocale.c
57-
postgres/src/port/explicit_bzero.c
58-
postgres/src/port/inet_net_ntop.c
59-
postgres/src/port/noblock.c
60-
postgres/src/port/pg_strong_random.c
61-
postgres/src/port/pgstrcasecmp.c
62-
postgres/src/port/snprintf.c
63-
postgres/src/port/strerror.c
64-
postgres/src/port/thread.c)
36+
postgres/src/common/base64.c
37+
postgres/src/common/cryptohash.c
38+
postgres/src/common/encnames.c
39+
postgres/src/common/hmac.c
40+
postgres/src/common/ip.c
41+
postgres/src/common/link-canary.c
42+
postgres/src/common/md5.c
43+
postgres/src/common/md5_common.c
44+
postgres/src/common/saslprep.c
45+
postgres/src/common/scram-common.c
46+
postgres/src/common/sha1.c
47+
postgres/src/common/sha2.c
48+
postgres/src/common/string.c
49+
postgres/src/common/unicode_norm.c
50+
postgres/src/common/wchar.c
51+
postgres/src/interfaces/libpq/fe-auth-scram.c
52+
postgres/src/interfaces/libpq/fe-auth.c
53+
postgres/src/interfaces/libpq/fe-connect.c
54+
postgres/src/interfaces/libpq/fe-exec.c
55+
postgres/src/interfaces/libpq/fe-lobj.c
56+
postgres/src/interfaces/libpq/fe-misc.c
57+
postgres/src/interfaces/libpq/fe-print.c
58+
postgres/src/interfaces/libpq/fe-protocol3.c
59+
postgres/src/interfaces/libpq/fe-secure.c
60+
postgres/src/interfaces/libpq/fe-trace.c
61+
postgres/src/interfaces/libpq/legacy-pqsignal.c
62+
postgres/src/interfaces/libpq/libpq-events.c
63+
postgres/src/interfaces/libpq/pqexpbuffer.c
64+
postgres/src/port/chklocale.c
65+
postgres/src/port/explicit_bzero.c
66+
postgres/src/port/inet_net_ntop.c
67+
postgres/src/port/noblock.c
68+
postgres/src/port/pg_strong_random.c
69+
postgres/src/port/pgstrcasecmp.c
70+
postgres/src/port/snprintf.c
71+
postgres/src/port/strerror.c
72+
postgres/src/port/thread.c)
6573

6674
if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" OR WIN32)
6775
set(LIBPG_SOURCES ${LIBPG_SOURCES} postgres/src/port/strlcpy.c
68-
postgres/src/port/getpeereid.c)
76+
postgres/src/port/getpeereid.c)
6977
endif()
7078

7179
if(WIN32)
7280
set(LIBPG_SOURCES
73-
${LIBPG_SOURCES}
74-
postgres/src/interfaces/libpq/pthread-win32.c
75-
postgres/src/interfaces/libpq/win32.c
76-
postgres/src/port/getaddrinfo.c
77-
postgres/src/port/gettimeofday.c
78-
postgres/src/port/inet_aton.c
79-
postgres/src/port/open.c
80-
postgres/src/port/pgsleep.c
81-
postgres/src/port/system.c
82-
postgres/src/port/win32error.c
83-
postgres/src/port/win32setlocale.c
84-
postgres/src/port/win32stat.c)
81+
${LIBPG_SOURCES}
82+
postgres/src/interfaces/libpq/pthread-win32.c
83+
postgres/src/interfaces/libpq/win32.c
84+
postgres/src/port/getaddrinfo.c
85+
postgres/src/port/gettimeofday.c
86+
postgres/src/port/inet_aton.c
87+
postgres/src/port/open.c
88+
postgres/src/port/pgsleep.c
89+
postgres/src/port/system.c
90+
postgres/src/port/win32error.c
91+
postgres/src/port/win32setlocale.c
92+
postgres/src/port/win32stat.c)
8593

8694
endif()
8795

@@ -91,21 +99,23 @@ function(PREPEND var prefix)
9199
list(APPEND listVar "${prefix}/${f}")
92100
endforeach(f)
93101
set(${var}
94-
"${listVar}"
95-
PARENT_SCOPE)
102+
"${listVar}"
103+
PARENT_SCOPE)
96104
endfunction(PREPEND)
97105

98106
prepend(LIBPG_SOURCES_FULLPATH ${CMAKE_CURRENT_SOURCE_DIR} ${LIBPG_SOURCES})
99107

100108
message(${CMAKE_SOURCE_DIR})
101109
add_custom_command(
102-
OUTPUT ${LIBPG_SOURCES_FULLPATH}
103-
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
104-
COMMAND sh pgconfigure)
110+
OUTPUT ${LIBPG_SOURCES_FULLPATH}
111+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
112+
COMMAND sh pgconfigure)
105113

106114
set(PARAMETERS "-no-warnings")
107-
build_loadable_extension(${TARGET_NAME} ${PARAMETERS} postgres_scanner.cpp ${LIBPG_SOURCES_FULLPATH})
115+
build_loadable_extension(${TARGET_NAME} ${PARAMETERS} postgres_scanner.cpp
116+
${LIBPG_SOURCES_FULLPATH})
108117

109118
if(WIN32)
110-
target_link_libraries(${TARGET_NAME}_loadable_extension wsock32 ws2_32 wldap32 secur32)
111-
endif()
119+
target_link_libraries(${TARGET_NAME}_loadable_extension wsock32 ws2_32
120+
wldap32 secur32)
121+
endif()

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ release: pull
3636
test: release
3737
./build/release/test/unittest --test-dir . "[postgres_scanner]"
3838

39-
format:
39+
format: pull
40+
cp duckdb/.clang-format .
4041
clang-format --sort-includes=0 -style=file -i postgres_scanner.cpp
4142
clang-format --sort-includes=0 -style=file -i concurrency_test.cpp
4243
cmake-format -i CMakeLists.txt
43-
cmake-format -i postgres/CMakeLists.txt

create-postgres-tables.sh

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ insert into cars(brand, model, color)
4242
('bentley', 'mulsanne', 'gray'),
4343
('ford', 'T', 'black');
4444
45+
create table intervals as select '42 day'::INTERVAL interval_days UNION ALL SELECT '42 month'::INTERVAL UNION ALL SELECT '42 year'::INTERVAL UNION ALL SELECT '42 minute'::INTERVAL UNION ALL SELECT '42 second'::INTERVAL UNION ALL SELECT '0.42 second'::INTERVAL UNION ALL SELECT '-42 day'::INTERVAL interval_days UNION ALL SELECT NULL::INTERVAL;
46+
4547
" | psql -d postgresscanner
4648

4749

postgres_scanner.cpp

+18-3
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,9 @@ static LogicalType DuckDBType(PostgresColumnInfo &info, PGconn *conn) {
172172
} else if (pgtypename == "float8") {
173173
return LogicalType::DOUBLE;
174174
} else if (pgtypename == "numeric") {
175-
if (atttypmod == -1) { // zero?
176-
throw IOException("Unbound NUMERIC types are not supported");
177-
}
175+
if (atttypmod == -1) { // zero?
176+
throw IOException("Unbound NUMERIC types are not supported");
177+
}
178178
auto width = ((atttypmod - sizeof(int32_t)) >> 16) & 0xffff;
179179
auto scale = (((atttypmod - sizeof(int32_t)) & 0x7ff) ^ 1024) - 1024;
180180
return LogicalType::DECIMAL(width, scale);
@@ -194,6 +194,8 @@ static LogicalType DuckDBType(PostgresColumnInfo &info, PGconn *conn) {
194194
return LogicalType::TIMESTAMP;
195195
} else if (pgtypename == "timestamptz") {
196196
return LogicalType::TIMESTAMP_TZ;
197+
} else if (pgtypename == "interval") {
198+
return LogicalType::INTERVAL;
197199
} else {
198200
throw IOException("Unsupported Postgres type %s", pgtypename);
199201
}
@@ -683,7 +685,20 @@ static void ProcessValue(data_ptr_t value_ptr, idx_t value_len, const PostgresBi
683685
}
684686
break;
685687
}
688+
case LogicalTypeId::INTERVAL: {
689+
if (bind_data->columns[col_idx].atttypmod != -1) {
690+
throw IOException("Interval with unsupported typmod %d", bind_data->columns[col_idx].atttypmod);
691+
}
692+
693+
interval_t res;
686694

695+
res.micros = ntohll(Load<uint64_t>(value_ptr));
696+
res.days = ntohl(Load<uint32_t>(value_ptr + sizeof(uint64_t)));
697+
res.months = ntohl(Load<uint32_t>(value_ptr + sizeof(uint64_t) + +sizeof(uint32_t)));
698+
699+
FlatVector::GetData<interval_t>(out_vec)[output_offset] = res;
700+
break;
701+
}
687702
default:
688703
throw InternalException("Unsupported Type %s", type.ToString());
689704
}

test/postgres_scanner/interval.test

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
statement ok
2+
LOAD 'build/release/extension/postgres_scanner/postgres_scanner.duckdb_extension';
3+
4+
statement ok
5+
pragma enable_verification
6+
7+
statement ok
8+
CALL postgres_attach('dbname=postgresscanner');
9+
10+
query I
11+
select * from intervals
12+
----
13+
42 days
14+
3 years 6 months
15+
42 years
16+
00:42:00
17+
00:00:42
18+
00:00:00.42
19+
-42 days
20+
NULL

0 commit comments

Comments
 (0)