@@ -131,22 +131,22 @@ get_selectivities(PlannerInfo *root,
131131/*
132132 * Based on the hashTupleDesc() routine
133133 */
134- static uint64
134+ static uint32
135135hashTempTupleDesc (TupleDesc desc )
136136{
137- uint64 s ;
137+ uint32 s ;
138138int i ;
139139
140140s = hash_combine (0 ,hash_uint32 (desc -> natts ));
141141
142142for (i = 0 ;i < desc -> natts ;++ i )
143143{
144144const char * attname = NameStr (TupleDescAttr (desc ,i )-> attname );
145- uint64 s1 ;
145+ uint32 s1 ;
146146
147- s = hash_combine64 (s ,hash_uint32 (TupleDescAttr (desc ,i )-> atttypid ));
148- s1 = hash_bytes_extended ((const unsignedchar * )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 unsignedchar * )attname ,strlen (attname ));
149+ s = hash_combine (s ,s1 );
150150}
151151return s ;
152152}
@@ -182,8 +182,8 @@ get_list_of_relids(PlannerInfo *root, Relids relids, RelSortOut *rels)
182182
183183if (!OidIsValid (entry -> relid ))
184184{
185- /*Invalid oid */
186- hashes = lappend_uint64 (hashes ,( UINT64_MAX /7 ) );
185+ /*TODO: Explain this logic. */
186+ hashes = lappend_int (hashes ,INT32_MAX /3 );
187187continue ;
188188}
189189
@@ -208,7 +208,7 @@ get_list_of_relids(PlannerInfo *root, Relids relids, RelSortOut *rels)
208208trel = relation_open (entry -> relid ,NoLock );
209209tdesc = RelationGetDescr (trel );
210210Assert (CheckRelationLockedByMe (trel ,AccessShareLock , true));
211- hashes = lappend_uint64 (hashes ,hashTempTupleDesc (tdesc ));
211+ hashes = lappend_int (hashes ,hashTempTupleDesc (tdesc ));
212212relation_close (trel ,NoLock );
213213}
214214else
@@ -218,9 +218,9 @@ get_list_of_relids(PlannerInfo *root, Relids relids, RelSortOut *rels)
218218get_namespace_name (get_rel_namespace (entry -> relid )),
219219relrewrite ?get_rel_name (relrewrite ) :relname );
220220
221- hashes = lappend_uint64 (hashes ,DatumGetInt64 ( hash_any_extended (
221+ hashes = lappend_int (hashes ,DatumGetInt32 ( hash_any (
222222(unsignedchar * )relname ,
223- strlen (relname ), 0 )));
223+ strlen (relname ))));
224224
225225hrels = lappend_oid (hrels ,entry -> relid );
226226}
@@ -575,7 +575,7 @@ AQOnodeCopy(struct ExtensibleNode *enew, const struct ExtensibleNode *eold)
575575/* These lists couldn't contain AQO nodes. Use basic machinery */
576576new -> rels = palloc (sizeof (RelSortOut ));
577577new -> 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 );
579579
580580new -> clauses = copyObject (old -> clauses );
581581new -> grouping_exprs = copyObject (old -> grouping_exprs );
@@ -610,21 +610,24 @@ AQOnodeEqual(const struct ExtensibleNode *a, const struct ExtensibleNode *b)
610610#define WRITE_FLOAT_FIELD (fldname ,format ) \
611611appendStringInfo(str, " :" CppAsString(fldname) " " format, node->fldname)
612612
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+ */
613622static void
614623AQOnodeOut (struct StringInfoData * str ,const struct ExtensibleNode * enode )
615624{
616625AQOPlanNode * node = (AQOPlanNode * )enode ;
617626
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;
628631
629632/* For Adaptive optimization DEBUG purposes */
630633WRITE_INT_FIELD (fss );
@@ -661,24 +664,28 @@ AQOnodeOut(struct StringInfoData *str, const struct ExtensibleNode *enode)
661664(void )token ;/* in case not used elsewhere */ \
662665local_node -> fldname = nodeRead (NULL ,0 )
663666
667+ /*
668+ * Deserialize AQO plan node from a string to internal representation.
669+ *
670+ * Should work in coherence with AQOnodeOut().
671+ */
664672static void
665673AQOnodeRead (struct ExtensibleNode * enode )
666674{
667675AQOPlanNode * local_node = (AQOPlanNode * )enode ;
668676const char * token ;
669677int length ;
670678
671- Assert (0 );
672679READ_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-
678680READ_ENUM_FIELD (jointype ,JoinType );
679681READ_FLOAT_FIELD (parallel_divisor );
680682READ_BOOL_FIELD (was_parametrized );
681683
684+ local_node -> rels = palloc0 (sizeof (RelSortOut ));
685+ local_node -> clauses = NIL ;
686+ local_node -> selectivities = NIL ;
687+ local_node -> grouping_exprs = NIL ;
688+
682689/* For Adaptive optimization DEBUG purposes */
683690READ_INT_FIELD (fss );
684691READ_FLOAT_FIELD (prediction );