Skip to content

Commit 400f60d

Browse files
committed
add some tests for basic types
1 parent 30a6a87 commit 400f60d

File tree

7 files changed

+132622
-6
lines changed

7 files changed

+132622
-6
lines changed

src/include/postgres_text_reader.hpp

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
#pragma once
1010

1111
#include "duckdb.hpp"
12+
#include "duckdb/common/exception.hpp"
1213
#include "duckdb/common/types.hpp"
1314
#include "duckdb/common/types/vector.hpp"
1415
#include "libpq-fe.h"
1516
#include "postgres_conversion.hpp"
1617
#include "postgres_connection.hpp"
18+
#include "postgres_utils.hpp"
1719
#include <cstring>
1820

1921
namespace duckdb {
@@ -45,21 +47,45 @@ struct PostgresTextReader {
4547
}
4648
}
4749

48-
void ReadColumn(idx_t col_idx) {
50+
void ReadColumn(const PostgresType &pg_type, idx_t col_idx) {
4951
col_vec.Resize(0, RowCount());
52+
col_vec.Initialize(true);
5053
for (idx_t row_idx = 0; row_idx < RowCount(); row_idx++) {
5154
if (PQgetisnull(result, row_idx, col_idx)) {
5255
FlatVector::SetNull(col_vec, row_idx, true);
5356
continue;
5457
}
5558
char *value = PQgetvalue(result, row_idx, col_idx);
5659
int value_len = PQgetlength(result, row_idx, col_idx);
57-
FlatVector::GetData<string_t>(col_vec)[row_idx] = StringVector::AddStringOrBlob(col_vec, value, value_len);
60+
FlatVector::SetNull(col_vec, row_idx, false);
61+
switch (pg_type.info) {
62+
case PostgresTypeAnnotation::FIXED_LENGTH_CHAR: {
63+
// CHAR column - remove trailing spaces
64+
while (value_len > 0 && value[value_len - 1] == ' ') {
65+
value_len--;
66+
}
67+
FlatVector::GetData<string_t>(col_vec)[row_idx] = StringVector::AddStringOrBlob(col_vec, value, value_len);
68+
break;
69+
}
70+
71+
default:
72+
FlatVector::GetData<string_t>(col_vec)[row_idx] = StringVector::AddStringOrBlob(col_vec, value, value_len);
73+
break;
74+
}
75+
5876
}
5977
}
6078

61-
void LoadResultTo (idx_t &col_idx, Vector &out_vec) {
62-
ReadColumn(col_idx);
79+
void LoadResultTo (const LogicalType &type, const PostgresType &pg_type, Vector &out_vec, idx_t &col_idx) {
80+
switch (type.id()) {
81+
case LogicalTypeId::LIST:
82+
case LogicalTypeId::ENUM:
83+
throw NotImplementedException("Type %s doesn't support straight casting from string", type.ToString());
84+
85+
default:
86+
break;
87+
}
88+
ReadColumn(pg_type, col_idx);
6389
VectorOperations::DefaultCast(col_vec, out_vec, RowCount());
6490
}
6591

src/postgres_extension.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ static void LoadInternal(DatabaseInstance &db) {
182182
config.AddExtensionOption("pg_debug_show_queries", "DEBUG SETTING: print all queries sent to Postgres to stdout",
183183
LogicalType::BOOLEAN, Value::BOOLEAN(false), SetPostgresDebugQueryPrint);
184184
config.AddExtensionOption("pg_use_legacy_text_protocol", "Whether or not to use legacy TEXT protocol to read data. Set this to yes will ignore pg_use_binary_copy",
185-
LogicalType::BOOLEAN, Value::BOOLEAN(true));
185+
LogicalType::BOOLEAN, Value::BOOLEAN(false));
186186

187187
OptimizerExtension postgres_optimizer;
188188
postgres_optimizer.optimize_function = PostgresOptimizer::Optimize;

src/postgres_scanner.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#include "duckdb.hpp"
22

3+
#include <csignal>
34
#include <libpq-fe.h>
45

6+
#include "duckdb/common/exception.hpp"
57
#include "duckdb/common/unique_ptr.hpp"
68
#include "duckdb/main/extension_util.hpp"
79
#include "duckdb/common/shared_ptr.hpp"
@@ -505,7 +507,13 @@ void PostgresLocalState::ScanChunkWithTextReader(ClientContext &context, const P
505507
for (idx_t output_idx = 0; output_idx < output.ColumnCount(); output_idx++) {
506508
auto col_idx = column_ids[output_idx];
507509
auto &out_vec = output.data[output_idx];
508-
reader.LoadResultTo(col_idx, out_vec);
510+
if (col_idx == COLUMN_IDENTIFIER_ROW_ID) {
511+
PostgresType ctid_type;
512+
ctid_type.info = PostgresTypeAnnotation::CTID;
513+
reader.LoadResultTo(LogicalType::BIGINT, ctid_type, out_vec, col_idx);
514+
} else {
515+
reader.LoadResultTo(bind_data.types[col_idx], bind_data.postgres_types[col_idx], out_vec, col_idx);
516+
}
509517
}
510518
reader.Reset();
511519
done = true;

0 commit comments

Comments
 (0)