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

Commit df164b1

Browse files
committed
[refer #PGPRO-2400] Fix unaligned access to text tile
1 parent 7ee4f38 commit df164b1

File tree

2 files changed

+26
-25
lines changed

2 files changed

+26
-25
lines changed

vops.c

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,7 +1555,7 @@ Datum vops_text_input(PG_FUNCTION_ARGS)
15551555
elog(ERROR, "Invalid vops_char width");
15561556

15571557
var = vops_alloc_text(width);
1558-
result = (vops_tile_hdr*)VARDATA(var);
1558+
result = VOPS_TEXT_TILE(var);
15591559
result->null_mask = 0;
15601560
result->empty_mask = 0;
15611561
dst = (char*)result + 1;
@@ -1617,7 +1617,7 @@ PG_FUNCTION_INFO_V1(vops_text_output);
16171617
Datum vops_text_output(PG_FUNCTION_ARGS)
16181618
{
16191619
struct varlena* var = (struct varlena*)PG_GETARG_POINTER(0);
1620-
vops_tile_hdr* tile = (vops_tile_hdr*)VARDATA(var);
1620+
vops_tile_hdr* tile = VOPS_TEXT_TILE(var);
16211621
char* src = (char*)(tile + 1);
16221622
int width = VOPS_ELEM_SIZE(var);
16231623
int i;
@@ -1660,8 +1660,8 @@ Datum vops_text_##op(PG_FUNCTION_ARGS) \
16601660
{ \
16611661
struct varlena* vl = PG_GETARG_VARLENA_PP(0); \
16621662
struct varlena* vr = PG_GETARG_VARLENA_PP(1); \
1663-
vops_tile_hdr* left = (vops_tile_hdr*)VARDATA(vl); \
1664-
vops_tile_hdr* right = (vops_tile_hdr*)VARDATA(vl); \
1663+
vops_tile_hdr* left = VOPS_TEXT_TILE(vl); \
1664+
vops_tile_hdr* right = VOPS_TEXT_TILE(vl); \
16651665
size_t left_elem_size = VOPS_ELEM_SIZE(vl); \
16661666
size_t right_elem_size = VOPS_ELEM_SIZE(vr); \
16671667
char* l = (char*)(left + 1); \
@@ -1694,7 +1694,7 @@ Datum vops_text_##op##_rconst(PG_FUNCTION_ARGS) \
16941694
{ \
16951695
struct varlena* var = PG_GETARG_VARLENA_PP(0); \
16961696
text* t = PG_GETARG_TEXT_P(1); \
1697-
vops_tile_hdr* left = (vops_tile_hdr*)VARDATA(var); \
1697+
vops_tile_hdr* left = VOPS_TEXT_TILE(var); \
16981698
size_t elem_size = VOPS_ELEM_SIZE(var); \
16991699
char* const_data = (char*)VARDATA(t); \
17001700
size_t const_size = VARSIZE(t) - VARHDRSZ; \
@@ -1729,7 +1729,7 @@ Datum vops_text_##op##_lconst(PG_FUNCTION_ARGS) \
17291729
{ \
17301730
struct varlena* var = PG_GETARG_VARLENA_PP(1); \
17311731
text* t = PG_GETARG_TEXT_P(0); \
1732-
vops_tile_hdr* right = (vops_tile_hdr*)VARDATA(var); \
1732+
vops_tile_hdr* right = VOPS_TEXT_TILE(var); \
17331733
size_t elem_size = VOPS_ELEM_SIZE(var); \
17341734
char* const_data = (char*)VARDATA(t); \
17351735
size_t const_size = VARSIZE(t) - VARHDRSZ; \
@@ -1775,7 +1775,7 @@ Datum vops_text_const(PG_FUNCTION_ARGS)
17751775
size_t const_size = VARSIZE(t) - VARHDRSZ;
17761776
int width = PG_GETARG_INT32(1);
17771777
struct varlena* var = vops_alloc_text(width);
1778-
vops_tile_hdr* result = (vops_tile_hdr*)VARDATA(var);
1778+
vops_tile_hdr* result = VOPS_TEXT_TILE(var);
17791779
char* dst = (char*)(result + 1);
17801780
int i;
17811781
for (i = 0; i < TILE_SIZE; i++)
@@ -1801,14 +1801,14 @@ Datum vops_text_concat(PG_FUNCTION_ARGS)
18011801
{
18021802
struct varlena* vl = PG_GETARG_VARLENA_PP(0);
18031803
struct varlena* vr = PG_GETARG_VARLENA_PP(1);
1804-
vops_tile_hdr* left = (vops_tile_hdr*)VARDATA(vl);
1805-
vops_tile_hdr* right = (vops_tile_hdr*)VARDATA(vl);
1804+
vops_tile_hdr* left = VOPS_TEXT_TILE(vl);
1805+
vops_tile_hdr* right = VOPS_TEXT_TILE(vl);
18061806
size_t left_elem_size = VOPS_ELEM_SIZE(vl);
18071807
size_t right_elem_size = VOPS_ELEM_SIZE(vr);
18081808
char* l = (char*)(left + 1);
18091809
char* r = (char*)(right + 1);
18101810
struct varlena* var = vops_alloc_text(left_elem_size + right_elem_size);
1811-
vops_tile_hdr* result = (vops_tile_hdr*)VARDATA(var);
1811+
vops_tile_hdr* result = VOPS_TEXT_TILE(var);
18121812
char* dst = (char*)(result + 1);
18131813
int i;
18141814
for (i = 0; i < TILE_SIZE; i++) {
@@ -1831,7 +1831,7 @@ Datum vops_betwixt_text(PG_FUNCTION_ARGS)
18311831
size_t from_size = VARSIZE(from) - VARHDRSZ;
18321832
char* till_data = (char*)VARDATA(till);
18331833
size_t till_size = VARSIZE(till) - VARHDRSZ;
1834-
vops_tile_hdr* left = (vops_tile_hdr*)VARDATA(var);
1834+
vops_tile_hdr* left = VOPS_TEXT_TILE(var);
18351835
char* l = (char*)(left + 1);
18361836
vops_bool* result = (vops_bool*)palloc(sizeof(vops_bool));
18371837
int i;
@@ -1859,13 +1859,13 @@ PG_FUNCTION_INFO_V1(vops_ifnull_text);
18591859
Datum vops_ifnull_text(PG_FUNCTION_ARGS)
18601860
{
18611861
struct varlena* var = PG_GETARG_VARLENA_PP(0);
1862-
vops_tile_hdr* opd = (vops_tile_hdr*)VARDATA(var);
1862+
vops_tile_hdr* opd = VOPS_TEXT_TILE(var);
18631863
size_t elem_size = VOPS_ELEM_SIZE(var);
18641864
text* subst = PG_GETARG_TEXT_P(1);
18651865
char* subst_data = (char*)VARDATA(subst);
18661866
size_t subst_size = VARSIZE(subst) - VARHDRSZ;
18671867
struct varlena* result = vops_alloc_text(elem_size);
1868-
vops_tile_hdr* res = (vops_tile_hdr*)VARDATA(result);
1868+
vops_tile_hdr* res = VOPS_TEXT_TILE(result);
18691869
char* dst = (char*)(res + 1);
18701870
char* src = (char*)(opd + 1);
18711871
int i;
@@ -1890,15 +1890,15 @@ PG_FUNCTION_INFO_V1(vops_coalesce_text);
18901890
Datum vops_coalesce_text(PG_FUNCTION_ARGS)
18911891
{
18921892
struct varlena* left = PG_GETARG_VARLENA_PP(0);
1893-
vops_tile_hdr* opd = (vops_tile_hdr*)VARDATA(left);
1893+
vops_tile_hdr* opd = VOPS_TEXT_TILE(left);
18941894
size_t elem_size = VOPS_ELEM_SIZE(left);
18951895

18961896
struct varlena* right = PG_GETARG_VARLENA_PP(1);
1897-
vops_tile_hdr* subst = (vops_tile_hdr*)VARDATA(right);
1897+
vops_tile_hdr* subst = VOPS_TEXT_TILE(right);
18981898
size_t subst_elem_size = VOPS_ELEM_SIZE(right);
18991899

19001900
struct varlena* result = vops_alloc_text(elem_size);
1901-
vops_tile_hdr* res = (vops_tile_hdr*)VARDATA(result);
1901+
vops_tile_hdr* res = VOPS_TEXT_TILE(result);
19021902
char* dst = (char*)(res + 1);
19031903
char* src = (char*)(opd + 1);
19041904
int i;
@@ -1921,7 +1921,7 @@ PG_FUNCTION_INFO_V1(vops_text_first);
19211921
Datum vops_text_first(PG_FUNCTION_ARGS)
19221922
{
19231923
struct varlena* var = PG_GETARG_VARLENA_PP(0);
1924-
vops_tile_hdr* tile = (vops_tile_hdr*)VARDATA(var);
1924+
vops_tile_hdr* tile = VOPS_TEXT_TILE(var);
19251925
size_t elem_size = VOPS_ELEM_SIZE(var);
19261926

19271927
uint64 mask = ~(tile->empty_mask | tile->null_mask);
@@ -1943,7 +1943,7 @@ PG_FUNCTION_INFO_V1(vops_text_last);
19431943
Datum vops_text_last(PG_FUNCTION_ARGS)
19441944
{
19451945
struct varlena* var = PG_GETARG_VARLENA_PP(0);
1946-
vops_tile_hdr* tile = (vops_tile_hdr*)VARDATA(var);
1946+
vops_tile_hdr* tile = VOPS_TEXT_TILE(var);
19471947
size_t elem_size = VOPS_ELEM_SIZE(var);
19481948

19491949
uint64 mask = ~(tile->empty_mask | tile->null_mask);
@@ -1965,7 +1965,7 @@ PG_FUNCTION_INFO_V1(vops_text_low);
19651965
Datum vops_text_low(PG_FUNCTION_ARGS)
19661966
{
19671967
struct varlena* var = PG_GETARG_VARLENA_PP(0);
1968-
vops_tile_hdr* tile = (vops_tile_hdr*)VARDATA(var);
1968+
vops_tile_hdr* tile = VOPS_TEXT_TILE(var);
19691969
size_t elem_size = VOPS_ELEM_SIZE(var);
19701970

19711971
uint64 mask = ~(tile->empty_mask | tile->null_mask);
@@ -1997,7 +1997,7 @@ PG_FUNCTION_INFO_V1(vops_text_high);
19971997
Datum vops_text_high(PG_FUNCTION_ARGS)
19981998
{
19991999
struct varlena* var = PG_GETARG_VARLENA_PP(0);
2000-
vops_tile_hdr* tile = (vops_tile_hdr*)VARDATA(var);
2000+
vops_tile_hdr* tile = VOPS_TEXT_TILE(var);
20012001
size_t elem_size = VOPS_ELEM_SIZE(var);
20022002

20032003
uint64 mask = ~(tile->empty_mask | tile->null_mask);
@@ -2049,7 +2049,7 @@ Datum vops_text_first_accumulate(PG_FUNCTION_ARGS)
20492049
state->ts = tss->payload[i];
20502050
state->ts_is_null = false;
20512051
if (vars != NULL) {
2052-
vops_tile_hdr* tile = (vops_tile_hdr*)VARDATA(vars);
2052+
vops_tile_hdr* tile = VOPS_TEXT_TILE(vars);
20532053
if ((tile->empty_mask | tile->null_mask) & ((uint64)1 << i)) {
20542054
state->val_is_null = true;
20552055
} else {
@@ -2102,7 +2102,7 @@ Datum vops_text_last_accumulate(PG_FUNCTION_ARGS)
21022102
state->ts = tss->payload[i];
21032103
state->ts_is_null = false;
21042104
if (vars != NULL) {
2105-
vops_tile_hdr* tile = (vops_tile_hdr*)VARDATA(vars);
2105+
vops_tile_hdr* tile = VOPS_TEXT_TILE(vars);
21062106
if ((tile->empty_mask | tile->null_mask) & ((uint64)1 << i)) {
21072107
state->val_is_null = true;
21082108
} else {

vops.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#ifndef __VOPS_H__
22
#define __VOPS_H__
33

4-
#define VOPS_SIZEOF_TEXT(width) (VARHDRSZ + sizeof(vops_tile_hdr) + (width)*TILE_SIZE)
5-
#define VOPS_ELEM_SIZE(var) ((VARSIZE(var) - VARHDRSZ - sizeof(vops_tile_hdr)) / TILE_SIZE)
6-
#define VOPS_GET_TILE(val,tid) ((vops_tile_hdr*)(((tid) == VOPS_TEXT) ? VARDATA(DatumGetTextP(val)) : DatumGetPointer(val)))
4+
#define VOPS_SIZEOF_TEXT(width) (LONGALIGN(VARHDRSZ) + sizeof(vops_tile_hdr) + (width)*TILE_SIZE)
5+
#define VOPS_ELEM_SIZE(var) ((VARSIZE(var) - LONGALIGN(VARHDRSZ) - sizeof(vops_tile_hdr)) / TILE_SIZE)
6+
#define VOPS_TEXT_TILE(val) ((vops_tile_hdr*)((char*)DatumGetTextP(val) + LONGALIGN(VARHDRSZ)))
7+
#define VOPS_GET_TILE(val,tid) (((tid) == VOPS_TEXT) ? VOPS_TEXT_TILE(val) : (vops_tile_hdr*)DatumGetPointer(val))
78

89
typedef enum
910
{

0 commit comments

Comments
 (0)