@@ -45,7 +45,7 @@ detoast_external_attr(struct varlena *attr)
45
45
{
46
46
struct varlena * result ;
47
47
48
- if (VARATT_IS_EXTERNAL_ONDISK (attr ))
48
+ if (VARATT_IS_EXTERNAL_ONDISK (attr ) || VARATT_IS_EXTERNAL_ONDISK_INLINE ( attr ) )
49
49
{
50
50
/*
51
51
* This is an external stored plain value
@@ -114,7 +114,7 @@ detoast_external_attr(struct varlena *attr)
114
114
struct varlena *
115
115
detoast_attr (struct varlena * attr )
116
116
{
117
- if (VARATT_IS_EXTERNAL_ONDISK (attr ))
117
+ if (VARATT_IS_EXTERNAL_ONDISK (attr ) || VARATT_IS_EXTERNAL_ONDISK_INLINE ( attr ) )
118
118
{
119
119
/*
120
120
* This is an externally stored datum --- fetch it back from there
@@ -208,6 +208,9 @@ detoast_attr_slice(struct varlena *attr,
208
208
char * attrdata ;
209
209
int32 attrsize ;
210
210
211
+ if (VARATT_IS_EXTERNAL_ONDISK_INLINE (attr ))
212
+ elog (ERROR , "slicing of chunked attributes is not yet supported" ); /* FIXME */
213
+
211
214
if (VARATT_IS_EXTERNAL_ONDISK (attr ))
212
215
{
213
216
struct varatt_external toast_pointer ;
@@ -324,15 +327,33 @@ create_detoast_iterator(struct varlena *attr)
324
327
{
325
328
struct varatt_external toast_pointer ;
326
329
DetoastIterator iter ;
327
- if (VARATT_IS_EXTERNAL_ONDISK (attr ))
330
+ if (VARATT_IS_EXTERNAL_ONDISK (attr ) || VARATT_IS_EXTERNAL_ONDISK_INLINE ( attr ) )
328
331
{
332
+ int32 inlineSize ;
333
+
329
334
iter = (DetoastIterator ) palloc0 (sizeof (DetoastIteratorData ));
330
335
iter -> done = false;
331
336
iter -> nrefs = 1 ;
332
337
333
338
/* This is an externally stored datum --- initialize fetch datum iterator */
334
339
iter -> fetch_datum_iterator = create_fetch_datum_iterator (attr );
335
- VARATT_EXTERNAL_GET_POINTER (toast_pointer , attr );
340
+
341
+ /* Must copy to access aligned fields */
342
+ if (VARATT_IS_EXTERNAL_ONDISK_INLINE (attr ))
343
+ {
344
+ //VARATT_EXTERNAL_GET_POINTER(toast_pointer_inline, attr);
345
+ struct varatt_external_inline toast_pointer_inline ;
346
+
347
+ memcpy (& toast_pointer_inline , VARDATA_EXTERNAL (attr ), sizeof (toast_pointer_inline ));
348
+ toast_pointer = toast_pointer_inline .va_external ;
349
+ inlineSize = toast_pointer_inline .va_inline_size ;
350
+ }
351
+ else
352
+ {
353
+ VARATT_EXTERNAL_GET_POINTER (toast_pointer , attr );
354
+ inlineSize = 0 ;
355
+ }
356
+
336
357
if (VARATT_EXTERNAL_IS_COMPRESSED (toast_pointer ))
337
358
{
338
359
iter -> compressed = true;
@@ -353,6 +374,14 @@ create_detoast_iterator(struct varlena *attr)
353
374
/* point the buffer directly at the raw data */
354
375
iter -> buf = iter -> fetch_datum_iterator -> buf ;
355
376
}
377
+
378
+ if (inlineSize > 0 )
379
+ {
380
+ memcpy ((void * ) iter -> fetch_datum_iterator -> buf -> limit ,
381
+ VARDATA_EXTERNAL_INLINE (attr ), inlineSize );
382
+ iter -> fetch_datum_iterator -> buf -> limit += inlineSize ;
383
+ }
384
+
356
385
return iter ;
357
386
}
358
387
else if (VARATT_IS_EXTERNAL_INDIRECT (attr ))
@@ -431,14 +460,27 @@ toast_fetch_datum(struct varlena *attr)
431
460
{
432
461
Relation toastrel ;
433
462
struct varlena * result ;
463
+ struct varatt_external_inline toast_pointer_inline ;
434
464
struct varatt_external toast_pointer ;
435
465
int32 attrsize ;
466
+ int32 inlineSize ;
436
467
437
- if (!VARATT_IS_EXTERNAL_ONDISK (attr ))
468
+ if (!VARATT_IS_EXTERNAL_ONDISK (attr ) && ! VARATT_IS_EXTERNAL_ONDISK_INLINE ( attr ) )
438
469
elog (ERROR , "toast_fetch_datum shouldn't be called for non-ondisk datums" );
439
470
440
471
/* Must copy to access aligned fields */
441
- VARATT_EXTERNAL_GET_POINTER (toast_pointer , attr );
472
+ if (VARATT_IS_EXTERNAL_ONDISK_INLINE (attr ))
473
+ {
474
+ //VARATT_EXTERNAL_GET_POINTER(toast_pointer_inline, attr);
475
+ memcpy (& toast_pointer_inline , VARDATA_EXTERNAL (attr ), sizeof (toast_pointer_inline ));
476
+ toast_pointer = toast_pointer_inline .va_external ;
477
+ inlineSize = toast_pointer_inline .va_inline_size ;
478
+ }
479
+ else
480
+ {
481
+ VARATT_EXTERNAL_GET_POINTER (toast_pointer , attr );
482
+ inlineSize = 0 ;
483
+ }
442
484
443
485
attrsize = toast_pointer .va_extsize ;
444
486
@@ -453,14 +495,18 @@ toast_fetch_datum(struct varlena *attr)
453
495
return result ; /* Probably shouldn't happen, but just in
454
496
* case. */
455
497
498
+ if (inlineSize )
499
+ memcpy (VARDATA (result ), VARDATA_EXTERNAL_INLINE (attr ), inlineSize );
500
+
456
501
/*
457
502
* Open the toast relation and its indexes
458
503
*/
459
504
toastrel = table_open (toast_pointer .va_toastrelid , AccessShareLock );
460
505
461
506
/* Fetch all chunks */
462
507
table_relation_fetch_toast_slice (toastrel , toast_pointer .va_valueid ,
463
- attrsize , 0 , attrsize , result );
508
+ attrsize - inlineSize , 0 , attrsize - inlineSize ,
509
+ (struct varlena * )((char * ) result + inlineSize ));
464
510
465
511
/* Close toast table */
466
512
table_close (toastrel , AccessShareLock );
@@ -488,7 +534,7 @@ toast_fetch_datum_slice(struct varlena *attr, int32 sliceoffset,
488
534
struct varatt_external toast_pointer ;
489
535
int32 attrsize ;
490
536
491
- if (!VARATT_IS_EXTERNAL_ONDISK (attr ))
537
+ if (!VARATT_IS_EXTERNAL_ONDISK (attr )) /* FIXME */
492
538
elog (ERROR , "toast_fetch_datum_slice shouldn't be called for non-ondisk datums" );
493
539
494
540
/* Must copy to access aligned fields */
@@ -611,7 +657,7 @@ toast_raw_datum_size(Datum value)
611
657
struct varlena * attr = (struct varlena * ) DatumGetPointer (value );
612
658
Size result ;
613
659
614
- if (VARATT_IS_EXTERNAL_ONDISK (attr ))
660
+ if (VARATT_IS_EXTERNAL_ONDISK (attr ) || VARATT_IS_EXTERNAL_ONDISK_INLINE ( attr ) )
615
661
{
616
662
/* va_rawsize is the size of the original datum -- including header */
617
663
struct varatt_external toast_pointer ;
@@ -679,6 +725,13 @@ toast_datum_size(Datum value)
679
725
VARATT_EXTERNAL_GET_POINTER (toast_pointer , attr );
680
726
result = toast_pointer .va_extsize ;
681
727
}
728
+ else if (VARATT_IS_EXTERNAL_ONDISK_INLINE (attr ))
729
+ {
730
+ struct varatt_external toast_pointer ;
731
+
732
+ memcpy (& toast_pointer , VARDATA_EXTERNAL (attr ), sizeof (toast_pointer ));
733
+ result = toast_pointer .va_extsize ;
734
+ }
682
735
else if (VARATT_IS_EXTERNAL_INDIRECT (attr ))
683
736
{
684
737
struct varatt_indirect toast_pointer ;
0 commit comments