|
1 | 1 | //! Provides interface types and trait to develop Postgres foreign data wrapper |
2 | 2 | //! |
3 | 3 |
|
4 | | -use crate::instance::ForeignServer; |
5 | 4 | use crate::FdwRoutine; |
| 5 | +use crate::instance::ForeignServer; |
6 | 6 | use pgrx::pg_sys::panic::ErrorReport; |
7 | 7 | use pgrx::prelude::{Date, Interval, Time, Timestamp, TimestampWithTimeZone}; |
8 | 8 | use pgrx::{ |
| 9 | + AllocatedByRust, AnyNumeric, FromDatum, IntoDatum, JsonB, PgBuiltInOids, PgOid, |
9 | 10 | datum::Uuid, |
10 | 11 | fcinfo, |
11 | | - pg_sys::{self, bytea, BuiltinOid, Datum, Expr, ExprState, Oid}, |
12 | | - AllocatedByRust, AnyNumeric, FromDatum, IntoDatum, JsonB, PgBuiltInOids, PgOid, |
| 12 | + pg_sys::{self, BuiltinOid, Datum, Expr, ExprState, Oid, bytea}, |
13 | 13 | }; |
14 | 14 | use std::collections::HashMap; |
15 | 15 | use std::ffi::CStr; |
@@ -285,90 +285,94 @@ impl FromDatum for Cell { |
285 | 285 | where |
286 | 286 | Self: Sized, |
287 | 287 | { |
288 | | - let oid = PgOid::from(typoid); |
289 | | - match oid { |
290 | | - PgOid::BuiltIn(PgBuiltInOids::BOOLOID) => { |
291 | | - bool::from_datum(datum, is_null).map(Cell::Bool) |
292 | | - } |
293 | | - PgOid::BuiltIn(PgBuiltInOids::CHAROID) => i8::from_datum(datum, is_null).map(Cell::I8), |
294 | | - PgOid::BuiltIn(PgBuiltInOids::INT2OID) => { |
295 | | - i16::from_datum(datum, is_null).map(Cell::I16) |
296 | | - } |
297 | | - PgOid::BuiltIn(PgBuiltInOids::FLOAT4OID) => { |
298 | | - f32::from_datum(datum, is_null).map(Cell::F32) |
299 | | - } |
300 | | - PgOid::BuiltIn(PgBuiltInOids::INT4OID) => { |
301 | | - i32::from_datum(datum, is_null).map(Cell::I32) |
302 | | - } |
303 | | - PgOid::BuiltIn(PgBuiltInOids::FLOAT8OID) => { |
304 | | - f64::from_datum(datum, is_null).map(Cell::F64) |
305 | | - } |
306 | | - PgOid::BuiltIn(PgBuiltInOids::INT8OID) => { |
307 | | - i64::from_datum(datum, is_null).map(Cell::I64) |
308 | | - } |
309 | | - PgOid::BuiltIn(PgBuiltInOids::NUMERICOID) => { |
310 | | - AnyNumeric::from_datum(datum, is_null).map(Cell::Numeric) |
311 | | - } |
312 | | - PgOid::BuiltIn(PgBuiltInOids::TEXTOID) => { |
313 | | - String::from_datum(datum, is_null).map(Cell::String) |
314 | | - } |
315 | | - PgOid::BuiltIn(PgBuiltInOids::DATEOID) => { |
316 | | - Date::from_datum(datum, is_null).map(Cell::Date) |
317 | | - } |
318 | | - PgOid::BuiltIn(PgBuiltInOids::TIMEOID) => { |
319 | | - Time::from_datum(datum, is_null).map(Cell::Time) |
320 | | - } |
321 | | - PgOid::BuiltIn(PgBuiltInOids::TIMESTAMPOID) => { |
322 | | - Timestamp::from_datum(datum, is_null).map(Cell::Timestamp) |
323 | | - } |
324 | | - PgOid::BuiltIn(PgBuiltInOids::TIMESTAMPTZOID) => { |
325 | | - TimestampWithTimeZone::from_datum(datum, is_null).map(Cell::Timestamptz) |
326 | | - } |
327 | | - PgOid::BuiltIn(PgBuiltInOids::INTERVALOID) => { |
328 | | - Interval::from_datum(datum, is_null).map(Cell::Interval) |
329 | | - } |
330 | | - PgOid::BuiltIn(PgBuiltInOids::JSONBOID) => { |
331 | | - JsonB::from_datum(datum, is_null).map(Cell::Json) |
332 | | - } |
333 | | - PgOid::BuiltIn(PgBuiltInOids::BYTEAOID) => { |
334 | | - if is_null { |
335 | | - None |
336 | | - } else { |
337 | | - Some(Cell::Bytea(datum.cast_mut_ptr::<bytea>())) |
| 288 | + unsafe { |
| 289 | + let oid = PgOid::from(typoid); |
| 290 | + match oid { |
| 291 | + PgOid::BuiltIn(PgBuiltInOids::BOOLOID) => { |
| 292 | + bool::from_datum(datum, is_null).map(Cell::Bool) |
338 | 293 | } |
339 | | - } |
340 | | - PgOid::BuiltIn(PgBuiltInOids::UUIDOID) => { |
341 | | - Uuid::from_datum(datum, is_null).map(Cell::Uuid) |
342 | | - } |
343 | | - PgOid::BuiltIn(PgBuiltInOids::BOOLARRAYOID) => { |
344 | | - Vec::<Option<bool>>::from_datum(datum, false).map(Cell::BoolArray) |
345 | | - } |
346 | | - PgOid::BuiltIn(PgBuiltInOids::INT2ARRAYOID) => { |
347 | | - Vec::<Option<i16>>::from_datum(datum, false).map(Cell::I16Array) |
348 | | - } |
349 | | - PgOid::BuiltIn(PgBuiltInOids::INT4ARRAYOID) => { |
350 | | - Vec::<Option<i32>>::from_datum(datum, false).map(Cell::I32Array) |
351 | | - } |
352 | | - PgOid::BuiltIn(PgBuiltInOids::INT8ARRAYOID) => { |
353 | | - Vec::<Option<i64>>::from_datum(datum, false).map(Cell::I64Array) |
354 | | - } |
355 | | - PgOid::BuiltIn(PgBuiltInOids::FLOAT4ARRAYOID) => { |
356 | | - Vec::<Option<f32>>::from_datum(datum, false).map(Cell::F32Array) |
357 | | - } |
358 | | - PgOid::BuiltIn(PgBuiltInOids::FLOAT8ARRAYOID) => { |
359 | | - Vec::<Option<f64>>::from_datum(datum, false).map(Cell::F64Array) |
360 | | - } |
361 | | - PgOid::BuiltIn(PgBuiltInOids::TEXTARRAYOID) => { |
362 | | - Vec::<Option<String>>::from_datum(datum, false).map(Cell::StringArray) |
363 | | - } |
364 | | - PgOid::Custom(_) => { |
365 | | - if is_null { |
366 | | - None |
367 | | - } else { |
368 | | - Some(Cell::Bytea(datum.cast_mut_ptr::<bytea>())) |
| 294 | + PgOid::BuiltIn(PgBuiltInOids::CHAROID) => { |
| 295 | + i8::from_datum(datum, is_null).map(Cell::I8) |
| 296 | + } |
| 297 | + PgOid::BuiltIn(PgBuiltInOids::INT2OID) => { |
| 298 | + i16::from_datum(datum, is_null).map(Cell::I16) |
| 299 | + } |
| 300 | + PgOid::BuiltIn(PgBuiltInOids::FLOAT4OID) => { |
| 301 | + f32::from_datum(datum, is_null).map(Cell::F32) |
| 302 | + } |
| 303 | + PgOid::BuiltIn(PgBuiltInOids::INT4OID) => { |
| 304 | + i32::from_datum(datum, is_null).map(Cell::I32) |
| 305 | + } |
| 306 | + PgOid::BuiltIn(PgBuiltInOids::FLOAT8OID) => { |
| 307 | + f64::from_datum(datum, is_null).map(Cell::F64) |
| 308 | + } |
| 309 | + PgOid::BuiltIn(PgBuiltInOids::INT8OID) => { |
| 310 | + i64::from_datum(datum, is_null).map(Cell::I64) |
| 311 | + } |
| 312 | + PgOid::BuiltIn(PgBuiltInOids::NUMERICOID) => { |
| 313 | + AnyNumeric::from_datum(datum, is_null).map(Cell::Numeric) |
| 314 | + } |
| 315 | + PgOid::BuiltIn(PgBuiltInOids::TEXTOID) => { |
| 316 | + String::from_datum(datum, is_null).map(Cell::String) |
| 317 | + } |
| 318 | + PgOid::BuiltIn(PgBuiltInOids::DATEOID) => { |
| 319 | + Date::from_datum(datum, is_null).map(Cell::Date) |
| 320 | + } |
| 321 | + PgOid::BuiltIn(PgBuiltInOids::TIMEOID) => { |
| 322 | + Time::from_datum(datum, is_null).map(Cell::Time) |
| 323 | + } |
| 324 | + PgOid::BuiltIn(PgBuiltInOids::TIMESTAMPOID) => { |
| 325 | + Timestamp::from_datum(datum, is_null).map(Cell::Timestamp) |
| 326 | + } |
| 327 | + PgOid::BuiltIn(PgBuiltInOids::TIMESTAMPTZOID) => { |
| 328 | + TimestampWithTimeZone::from_datum(datum, is_null).map(Cell::Timestamptz) |
| 329 | + } |
| 330 | + PgOid::BuiltIn(PgBuiltInOids::INTERVALOID) => { |
| 331 | + Interval::from_datum(datum, is_null).map(Cell::Interval) |
| 332 | + } |
| 333 | + PgOid::BuiltIn(PgBuiltInOids::JSONBOID) => { |
| 334 | + JsonB::from_datum(datum, is_null).map(Cell::Json) |
| 335 | + } |
| 336 | + PgOid::BuiltIn(PgBuiltInOids::BYTEAOID) => { |
| 337 | + if is_null { |
| 338 | + None |
| 339 | + } else { |
| 340 | + Some(Cell::Bytea(datum.cast_mut_ptr::<bytea>())) |
| 341 | + } |
| 342 | + } |
| 343 | + PgOid::BuiltIn(PgBuiltInOids::UUIDOID) => { |
| 344 | + Uuid::from_datum(datum, is_null).map(Cell::Uuid) |
| 345 | + } |
| 346 | + PgOid::BuiltIn(PgBuiltInOids::BOOLARRAYOID) => { |
| 347 | + Vec::<Option<bool>>::from_datum(datum, false).map(Cell::BoolArray) |
| 348 | + } |
| 349 | + PgOid::BuiltIn(PgBuiltInOids::INT2ARRAYOID) => { |
| 350 | + Vec::<Option<i16>>::from_datum(datum, false).map(Cell::I16Array) |
| 351 | + } |
| 352 | + PgOid::BuiltIn(PgBuiltInOids::INT4ARRAYOID) => { |
| 353 | + Vec::<Option<i32>>::from_datum(datum, false).map(Cell::I32Array) |
| 354 | + } |
| 355 | + PgOid::BuiltIn(PgBuiltInOids::INT8ARRAYOID) => { |
| 356 | + Vec::<Option<i64>>::from_datum(datum, false).map(Cell::I64Array) |
| 357 | + } |
| 358 | + PgOid::BuiltIn(PgBuiltInOids::FLOAT4ARRAYOID) => { |
| 359 | + Vec::<Option<f32>>::from_datum(datum, false).map(Cell::F32Array) |
| 360 | + } |
| 361 | + PgOid::BuiltIn(PgBuiltInOids::FLOAT8ARRAYOID) => { |
| 362 | + Vec::<Option<f64>>::from_datum(datum, false).map(Cell::F64Array) |
| 363 | + } |
| 364 | + PgOid::BuiltIn(PgBuiltInOids::TEXTARRAYOID) => { |
| 365 | + Vec::<Option<String>>::from_datum(datum, false).map(Cell::StringArray) |
| 366 | + } |
| 367 | + PgOid::Custom(_) => { |
| 368 | + if is_null { |
| 369 | + None |
| 370 | + } else { |
| 371 | + Some(Cell::Bytea(datum.cast_mut_ptr::<bytea>())) |
| 372 | + } |
369 | 373 | } |
| 374 | + _ => None, |
370 | 375 | } |
371 | | - _ => None, |
372 | 376 | } |
373 | 377 | } |
374 | 378 | } |
|
0 commit comments