@@ -131,22 +131,22 @@ get_selectivities(PlannerInfo *root,
131
131
/*
132
132
* Based on the hashTupleDesc() routine
133
133
*/
134
- static uint64
134
+ static uint32
135
135
hashTempTupleDesc (TupleDesc desc )
136
136
{
137
- uint64 s ;
137
+ uint32 s ;
138
138
int i ;
139
139
140
140
s = hash_combine (0 , hash_uint32 (desc -> natts ));
141
141
142
142
for (i = 0 ; i < desc -> natts ; ++ i )
143
143
{
144
144
const char * attname = NameStr (TupleDescAttr (desc , i )-> attname );
145
- uint64 s1 ;
145
+ uint32 s1 ;
146
146
147
- s = hash_combine64 (s , hash_uint32 (TupleDescAttr (desc , i )-> atttypid ));
148
- s1 = hash_bytes_extended ((const unsigned char * ) attname , strlen (attname ), 0 );
149
- s = hash_combine64 (s , s1 );
147
+ s = hash_combine (s , hash_uint32 (TupleDescAttr (desc , i )-> atttypid ));
148
+ s1 = hash_bytes ((const unsigned char * ) attname , strlen (attname ));
149
+ s = hash_combine (s , s1 );
150
150
}
151
151
return s ;
152
152
}
@@ -182,8 +182,8 @@ get_list_of_relids(PlannerInfo *root, Relids relids, RelSortOut *rels)
182
182
183
183
if (!OidIsValid (entry -> relid ))
184
184
{
185
- /* Invalid oid */
186
- hashes = lappend_uint64 (hashes , ( UINT64_MAX / 7 ) );
185
+ /* TODO: Explain this logic. */
186
+ hashes = lappend_int (hashes , INT32_MAX / 3 );
187
187
continue ;
188
188
}
189
189
@@ -208,7 +208,7 @@ get_list_of_relids(PlannerInfo *root, Relids relids, RelSortOut *rels)
208
208
trel = relation_open (entry -> relid , NoLock );
209
209
tdesc = RelationGetDescr (trel );
210
210
Assert (CheckRelationLockedByMe (trel , AccessShareLock , true));
211
- hashes = lappend_uint64 (hashes , hashTempTupleDesc (tdesc ));
211
+ hashes = lappend_int (hashes , hashTempTupleDesc (tdesc ));
212
212
relation_close (trel , NoLock );
213
213
}
214
214
else
@@ -218,9 +218,9 @@ get_list_of_relids(PlannerInfo *root, Relids relids, RelSortOut *rels)
218
218
get_namespace_name (get_rel_namespace (entry -> relid )),
219
219
relrewrite ? get_rel_name (relrewrite ) : relname );
220
220
221
- hashes = lappend_uint64 (hashes , DatumGetInt64 ( hash_any_extended (
221
+ hashes = lappend_int (hashes , DatumGetInt32 ( hash_any (
222
222
(unsigned char * ) relname ,
223
- strlen (relname ), 0 )));
223
+ strlen (relname ))));
224
224
225
225
hrels = lappend_oid (hrels , entry -> relid );
226
226
}
@@ -575,7 +575,7 @@ AQOnodeCopy(struct ExtensibleNode *enew, const struct ExtensibleNode *eold)
575
575
/* These lists couldn't contain AQO nodes. Use basic machinery */
576
576
new -> rels = palloc (sizeof (RelSortOut ));
577
577
new -> rels -> hrels = list_copy (old -> rels -> hrels );
578
- new -> rels -> signatures = list_copy_uint64 (old -> rels -> signatures );
578
+ new -> rels -> signatures = list_copy (old -> rels -> signatures );
579
579
580
580
new -> clauses = copyObject (old -> clauses );
581
581
new -> grouping_exprs = copyObject (old -> grouping_exprs );
@@ -610,21 +610,24 @@ AQOnodeEqual(const struct ExtensibleNode *a, const struct ExtensibleNode *b)
610
610
#define WRITE_FLOAT_FIELD (fldname ,format ) \
611
611
appendStringInfo(str, " :" CppAsString(fldname) " " format, node->fldname)
612
612
613
+ /*
614
+ * Serialize AQO plan node to a string.
615
+ *
616
+ * Right now we can't correctly serialize all fields of the node. Taking into
617
+ * account that this action needed when a plan moves into parallel workers or
618
+ * just during debugging, we serialize it only partially, just for debug
619
+ * purposes.
620
+ * Some extensions may manipulate by parts of serialized plan too.
621
+ */
613
622
static void
614
623
AQOnodeOut (struct StringInfoData * str , const struct ExtensibleNode * enode )
615
624
{
616
625
AQOPlanNode * node = (AQOPlanNode * ) enode ;
617
626
618
- Assert (0 );
619
- WRITE_BOOL_FIELD (had_path );
620
- WRITE_NODE_FIELD (rels );
621
- WRITE_NODE_FIELD (clauses );
622
- WRITE_NODE_FIELD (selectivities );
623
- WRITE_NODE_FIELD (grouping_exprs );
624
-
625
- WRITE_ENUM_FIELD (jointype , JoinType );
626
- WRITE_FLOAT_FIELD (parallel_divisor , "%.5f" );
627
- WRITE_BOOL_FIELD (was_parametrized );
627
+ node -> had_path = false;
628
+ node -> jointype = 0 ;
629
+ node -> parallel_divisor = 1.0 ;
630
+ node -> was_parametrized = false;
628
631
629
632
/* For Adaptive optimization DEBUG purposes */
630
633
WRITE_INT_FIELD (fss );
@@ -661,24 +664,28 @@ AQOnodeOut(struct StringInfoData *str, const struct ExtensibleNode *enode)
661
664
(void ) token ; /* in case not used elsewhere */ \
662
665
local_node -> fldname = nodeRead (NULL , 0 )
663
666
667
+ /*
668
+ * Deserialize AQO plan node from a string to internal representation.
669
+ *
670
+ * Should work in coherence with AQOnodeOut().
671
+ */
664
672
static void
665
673
AQOnodeRead (struct ExtensibleNode * enode )
666
674
{
667
675
AQOPlanNode * local_node = (AQOPlanNode * ) enode ;
668
676
const char * token ;
669
677
int length ;
670
678
671
- Assert (0 );
672
679
READ_BOOL_FIELD (had_path );
673
- READ_NODE_FIELD (rels );
674
- READ_NODE_FIELD (clauses );
675
- READ_NODE_FIELD (selectivities );
676
- READ_NODE_FIELD (grouping_exprs );
677
-
678
680
READ_ENUM_FIELD (jointype , JoinType );
679
681
READ_FLOAT_FIELD (parallel_divisor );
680
682
READ_BOOL_FIELD (was_parametrized );
681
683
684
+ local_node -> rels = palloc0 (sizeof (RelSortOut ));
685
+ local_node -> clauses = NIL ;
686
+ local_node -> selectivities = NIL ;
687
+ local_node -> grouping_exprs = NIL ;
688
+
682
689
/* For Adaptive optimization DEBUG purposes */
683
690
READ_INT_FIELD (fss );
684
691
READ_FLOAT_FIELD (prediction );
0 commit comments