|
9 | 9 | #pragma once
|
10 | 10 |
|
11 | 11 | #include "duckdb.hpp"
|
| 12 | +#include "duckdb/common/exception.hpp" |
12 | 13 | #include "duckdb/common/types.hpp"
|
13 | 14 | #include "duckdb/common/types/vector.hpp"
|
14 | 15 | #include "libpq-fe.h"
|
15 | 16 | #include "postgres_conversion.hpp"
|
16 | 17 | #include "postgres_connection.hpp"
|
| 18 | +#include "postgres_utils.hpp" |
17 | 19 | #include <cstring>
|
18 | 20 |
|
19 | 21 | namespace duckdb {
|
@@ -45,21 +47,45 @@ struct PostgresTextReader {
|
45 | 47 | }
|
46 | 48 | }
|
47 | 49 |
|
48 |
| - void ReadColumn(idx_t col_idx) { |
| 50 | + void ReadColumn(const PostgresType &pg_type, idx_t col_idx) { |
49 | 51 | col_vec.Resize(0, RowCount());
|
| 52 | + col_vec.Initialize(true); |
50 | 53 | for (idx_t row_idx = 0; row_idx < RowCount(); row_idx++) {
|
51 | 54 | if (PQgetisnull(result, row_idx, col_idx)) {
|
52 | 55 | FlatVector::SetNull(col_vec, row_idx, true);
|
53 | 56 | continue;
|
54 | 57 | }
|
55 | 58 | char *value = PQgetvalue(result, row_idx, col_idx);
|
56 | 59 | 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 | + |
58 | 76 | }
|
59 | 77 | }
|
60 | 78 |
|
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); |
63 | 89 | VectorOperations::DefaultCast(col_vec, out_vec, RowCount());
|
64 | 90 | }
|
65 | 91 |
|
|
0 commit comments