Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 1bec314

Browse files
author
Nikita Malakhov
committed
Default (generic) toaster re-implemented using Toaster API.
Default Toaster could be replaced with custom toaster by SET TOASTER clause in CREATE TABLE or ALTER TABLE expression Added src/backend/access/toast/README.toastapi 0003_toaster_default patch
1 parent c1fcce0 commit 1bec314

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+2430
-1204
lines changed

contrib/amcheck/verify_heapam.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*/
1111
#include "postgres.h"
1212

13-
#include "access/detoast.h"
13+
#include "access/toasterapi.h"
1414
#include "access/genam.h"
1515
#include "access/heapam.h"
1616
#include "access/heaptoast.h"
@@ -24,6 +24,8 @@
2424
#include "storage/procarray.h"
2525
#include "utils/builtins.h"
2626
#include "utils/fmgroids.h"
27+
#include "access/toast_helper.h"
28+
#include "catalog/toasting.h"
2729

2830
PG_FUNCTION_INFO_V1(verify_heapam);
2931

contrib/dummy_toaster/dummy_toaster--1.0.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ LANGUAGE C;
1212
CREATE TOASTER dummy_toaster HANDLER dummy_toaster_handler;
1313

1414
COMMENT ON TOASTER dummy_toaster IS 'dummy_toaster is a dummy toaster';
15+

contrib/dummy_toaster/dummy_toaster.c

Lines changed: 85 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*-------------------------------------------------------------------------
22
*
33
* dummy_toaster.c
4-
* Dummy toaster for Toaster API.
4+
* Dummy toaster - sample toaster for Toaster API.
55
*
66
* Portions Copyright (c) 2016-2021, PostgreSQL Global Development Group
77
* Portions Copyright (c) 1990-1993, Regents of the University of California
@@ -14,6 +14,26 @@
1414
#include "postgres.h"
1515
#include "fmgr.h"
1616
#include "access/toasterapi.h"
17+
#include "access/heaptoast.h"
18+
#include "access/htup_details.h"
19+
#include "catalog/pg_toaster.h"
20+
#include "commands/defrem.h"
21+
#include "utils/builtins.h"
22+
#include "utils/syscache.h"
23+
#include "access/toast_compression.h"
24+
#include "access/xact.h"
25+
#include "catalog/binary_upgrade.h"
26+
#include "catalog/catalog.h"
27+
#include "catalog/dependency.h"
28+
#include "catalog/heap.h"
29+
#include "catalog/index.h"
30+
#include "catalog/namespace.h"
31+
#include "catalog/pg_am.h"
32+
#include "catalog/pg_namespace.h"
33+
#include "catalog/pg_opclass.h"
34+
#include "catalog/pg_type.h"
35+
#include "catalog/toasting.h"
36+
#include "miscadmin.h"
1737
#include "nodes/makefuncs.h"
1838

1939
PG_MODULE_MAGIC;
@@ -22,68 +42,106 @@ PG_FUNCTION_INFO_V1(dummy_toaster_handler);
2242
#define MAX_DUMMY_CHUNK_SIZE 1024
2343

2444
/*
25-
* Dummy Toaster is a sample custom toaster for developers to show Toaster API
26-
* functionality and correct way to add new Toasters to PgSQL.
27-
*/
28-
29-
30-
/*
31-
* Dummy detoast function, does nothing
45+
* Dummy Detoast function, receives single varatt_custom pointer,
46+
* detoasts it to varlena.
47+
*
3248
*/
3349
static Datum
34-
dummy_detoast(Relation toast_rel, Datum toast_ptr,
50+
dummy_detoast(Datum toast_ptr,
3551
int offset, int length)
3652
{
53+
struct varlena *attr = (struct varlena *) DatumGetPointer(toast_ptr);
3754
struct varlena *result;
38-
result = palloc(0);
55+
56+
Assert(VARATT_IS_EXTERNAL(attr));
57+
Assert(VARATT_IS_CUSTOM(attr));
58+
59+
result = palloc(VARATT_CUSTOM_GET_DATA_RAW_SIZE(attr));
60+
SET_VARSIZE(result, VARATT_CUSTOM_GET_DATA_RAW_SIZE(attr));
61+
memcpy(VARDATA(result), VARATT_CUSTOM_GET_DATA(attr),
62+
VARATT_CUSTOM_GET_DATA_RAW_SIZE(attr) - VARHDRSZ);
63+
3964
return PointerGetDatum(result);
4065
}
4166

4267
/*
43-
* Dummy Toast function, does nothing
68+
* Dummy Toast function, receives varlena pointer, creates single varatt_custom
69+
* varlena size is limited to 1024 bytes
4470
*/
4571
static Datum
4672
dummy_toast(Relation toast_rel, Oid toasterid,
4773
Datum value, Datum oldvalue,
4874
int max_inline_size, int options)
4975
{
76+
struct varlena *attr;
5077
struct varlena *result;
51-
result = palloc(0);
78+
int len;
79+
attr = pg_detoast_datum((struct varlena*)DatumGetPointer(value));
80+
81+
if(VARSIZE_ANY_EXHDR(attr) > MAX_DUMMY_CHUNK_SIZE)
82+
{
83+
ereport(ERROR,
84+
(errcode(ERRCODE_DATA_CORRUPTED),
85+
errmsg_internal("Data <%d> size exceeds MAX_DUMMY_CHUNK_SIZE <%d>",
86+
(int)VARSIZE_ANY_EXHDR(attr), MAX_DUMMY_CHUNK_SIZE)));
87+
88+
}
89+
90+
len = VARATT_CUSTOM_SIZE(VARSIZE_ANY_EXHDR(attr));
91+
92+
if (max_inline_size > 0 && len > max_inline_size)
93+
{
94+
ereport(ERROR,
95+
(errcode(ERRCODE_DATA_CORRUPTED),
96+
errmsg_internal("Data <%d> size exceeds max inline size <%d>",
97+
len, max_inline_size)));
98+
}
99+
100+
result = palloc(len);
101+
102+
SET_VARTAG_EXTERNAL(result, VARTAG_CUSTOM);
103+
VARATT_CUSTOM_SET_DATA_RAW_SIZE(result, VARSIZE_ANY_EXHDR(attr) + VARHDRSZ);
104+
VARATT_CUSTOM_SET_DATA_SIZE(result, len);
105+
VARATT_CUSTOM_SET_TOASTERID(result, toasterid);
106+
107+
memcpy(VARATT_CUSTOM_GET_DATA(result), VARDATA_ANY(attr),
108+
VARSIZE_ANY_EXHDR(attr));
109+
110+
if ((char*)attr != DatumGetPointer(value))
111+
pfree(attr);
112+
52113
return PointerGetDatum(result);
53114
}
54115

55116
/*
56-
* Dummy deltoast function, does nothing
117+
* Dummy delete function
57118
*/
58119
static void
59120
dummy_delete(Datum value, bool is_speculative)
60121
{
61122
}
62123

63124
/*
64-
* Dummy init function, does nothing
125+
* Dummy Validate, always returns True
126+
*
65127
*/
66-
static void
67-
dummy_toast_init(Relation rel, Datum reloptions, LOCKMODE lockmode,
68-
bool check, Oid OIDOldToast)
128+
static bool
129+
dummy_toaster_validate(Oid typeoid, char storage, char compression,
130+
Oid amoid, bool false_ok)
69131
{
132+
bool result = true;
133+
return result;
70134
}
71135

72136
/*
73137
* Dummy validation function, always returns TRUE
74138
*/
75-
static bool
76-
dummy_toaster_validate(Oid typeoid, char storage, char compression,
77-
Oid amoid, bool false_ok)
139+
static void
140+
dummy_toast_init(Relation rel, Oid toastoid, Oid toastindexoid, Datum reloptions, LOCKMODE lockmode,
141+
bool check, Oid OIDOldToast)
78142
{
79-
return true;
80143
}
81144

82-
/*
83-
* Dummy toaster handler.
84-
* All Toaster functions declared in toasterapi.h and implemented in Custom
85-
* Toasters must be assigned to TsrRoutine structure
86-
*/
87145
Datum
88146
dummy_toaster_handler(PG_FUNCTION_ARGS)
89147
{
@@ -95,7 +153,7 @@ dummy_toaster_handler(PG_FUNCTION_ARGS)
95153
tsr->detoast = dummy_detoast;
96154
tsr->deltoast = dummy_delete;
97155
tsr->get_vtable = NULL;
98-
tsr->toastervalidate = NULL;
156+
tsr->toastervalidate = dummy_toaster_validate;
99157

100158
PG_RETURN_POINTER(tsr);
101159
}

0 commit comments

Comments
 (0)