@@ -1582,6 +1582,7 @@ const char *database_value_text (dbvalue_t *value) {
15821582 v -> cstring = OidOutputFunctionCall (outfunc , v -> datum );
15831583 }
15841584 v -> owns_cstring = true;
1585+ v -> owns_cstring_palloc = true;
15851586 }
15861587
15871588 return v -> cstring ;
@@ -1616,10 +1617,10 @@ void database_value_free (dbvalue_t *value) {
16161617 if (!v ) return ;
16171618
16181619 if (v -> owned_detoast ) {
1619- cloudsync_memory_free (v -> owned_detoast );
1620+ ( v -> owns_detoast_palloc ) ? pfree ( v -> owned_detoast ) : cloudsync_memory_free (v -> owned_detoast );
16201621 }
16211622 if (v -> owns_cstring && v -> cstring ) {
1622- cloudsync_memory_free (v -> cstring );
1623+ ( v -> owns_cstring_palloc ) ? pfree ( v -> cstring ) : cloudsync_memory_free (v -> cstring );
16231624 }
16241625 cloudsync_memory_free (v );
16251626}
@@ -1631,14 +1632,16 @@ void *database_value_dup (dbvalue_t *value) {
16311632 pgvalue_t * copy = pgvalue_create (v -> datum , v -> typeid , v -> typmod , v -> collation , v -> isnull );
16321633 if (v -> detoasted && v -> owned_detoast ) {
16331634 Size len = VARSIZE_ANY (v -> owned_detoast );
1634- copy -> owned_detoast = cloudsync_memory_alloc (len );
1635+ copy -> owned_detoast = ( v -> owns_detoast_palloc ) ? palloc ( len ) : cloudsync_memory_alloc (len );
16351636 memcpy (copy -> owned_detoast , v -> owned_detoast , len );
16361637 copy -> datum = PointerGetDatum (copy -> owned_detoast );
16371638 copy -> detoasted = true;
1639+ copy -> owns_detoast_palloc = v -> owns_detoast_palloc ;
16381640 }
16391641 if (v -> cstring ) {
1640- copy -> cstring = cloudsync_string_dup (v -> cstring );
1642+ copy -> cstring = ( v -> owns_cstring_palloc ) ? pstrdup ( v -> cstring ) : cloudsync_string_dup (v -> cstring );
16411643 copy -> owns_cstring = true;
1644+ copy -> owns_cstring_palloc = v -> owns_cstring_palloc ;
16421645 }
16431646 return (void * )copy ;
16441647}
0 commit comments