2727
2828#include "aqo.h"
2929#include "hash.h"
30+ #include "path_utils.h"
3031
3132static int get_str_hash (const char * str );
3233static int get_node_hash (Node * node );
@@ -218,11 +219,11 @@ get_fss_for_object(List *relsigns, List *clauselist,
218219i = 0 ;
219220foreach (lc ,clauselist )
220221{
221- RestrictInfo * rinfo = lfirst_node ( RestrictInfo , lc );
222+ AQOClause * clause = ( AQOClause * ) lfirst ( lc );
222223
223- clause_hashes [i ]= get_clause_hash (rinfo -> clause ,
224+ clause_hashes [i ]= get_clause_hash (clause -> clause ,
224225nargs ,args_hash ,eclass_hash );
225- args = get_clause_args_ptr (rinfo -> clause );
226+ args = get_clause_args_ptr (clause -> clause );
226227clause_has_consts [i ]= (args != NULL && has_consts (* args ));
227228i ++ ;
228229}
@@ -317,14 +318,14 @@ get_clause_hash(Expr *clause, int nargs, int *args_hash, int *eclass_hash)
317318
318319cclause = copyObject (clause );
319320args = get_clause_args_ptr (cclause );
321+ /* XXX: Why does it work even if this loop is removed? */
320322foreach (l ,* args )
321323{
322324arg_eclass = get_arg_eclass (get_node_hash (lfirst (l )),
323325nargs ,args_hash ,eclass_hash );
324326if (arg_eclass != 0 )
325327{
326- lfirst (l )= makeNode (Param );
327- ((Param * )lfirst (l ))-> paramid = arg_eclass ;
328+ lfirst (l )= create_aqo_const_node (AQO_NODE_EXPR ,arg_eclass );
328329}
329330}
330331if (!clause_is_eq_clause (clause )|| has_consts (* args ))
@@ -554,7 +555,7 @@ get_arg_eclass(int arg_hash, int nargs, int *args_hash, int *eclass_hash)
554555static void
555556get_clauselist_args (List * clauselist ,int * nargs ,int * * args_hash )
556557{
557- RestrictInfo * rinfo ;
558+ AQOClause * clause ;
558559List * * args ;
559560ListCell * l ;
560561ListCell * l2 ;
@@ -564,9 +565,9 @@ get_clauselist_args(List *clauselist, int *nargs, int **args_hash)
564565
565566foreach (l ,clauselist )
566567{
567- rinfo = (RestrictInfo * )lfirst (l );
568- args = get_clause_args_ptr (rinfo -> clause );
569- if (args != NULL && clause_is_eq_clause (rinfo -> clause ))
568+ clause = (AQOClause * )lfirst (l );
569+ args = get_clause_args_ptr (clause -> clause );
570+ if (args != NULL && clause_is_eq_clause (clause -> clause ))
570571foreach (l2 ,* args )
571572if (!IsA (lfirst (l2 ),Const ))
572573cnt ++ ;
@@ -575,9 +576,9 @@ get_clauselist_args(List *clauselist, int *nargs, int **args_hash)
575576* args_hash = palloc (cnt * sizeof (* * args_hash ));
576577foreach (l ,clauselist )
577578{
578- rinfo = (RestrictInfo * )lfirst (l );
579- args = get_clause_args_ptr (rinfo -> clause );
580- if (args != NULL && clause_is_eq_clause (rinfo -> clause ))
579+ clause = (AQOClause * )lfirst (l );
580+ args = get_clause_args_ptr (clause -> clause );
581+ if (args != NULL && clause_is_eq_clause (clause -> clause ))
581582foreach (l2 ,* args )
582583if (!IsA (lfirst (l2 ),Const ))
583584(* args_hash )[i ++ ]= get_node_hash (lfirst (l2 ));
@@ -632,7 +633,7 @@ disjoint_set_merge_eclasses(int *p, int v1, int v2)
632633static int *
633634perform_eclasses_join (List * clauselist ,int nargs ,int * args_hash )
634635{
635- RestrictInfo * rinfo ;
636+ AQOClause * clause ;
636637int * p ;
637638ListCell * l ,
638639* l2 ;
@@ -646,9 +647,9 @@ perform_eclasses_join(List *clauselist, int nargs, int *args_hash)
646647
647648foreach (l ,clauselist )
648649{
649- rinfo = (RestrictInfo * )lfirst (l );
650- args = get_clause_args_ptr (rinfo -> clause );
651- if (args != NULL && clause_is_eq_clause (rinfo -> clause ))
650+ clause = (AQOClause * )lfirst (l );
651+ args = get_clause_args_ptr (clause -> clause );
652+ if (args != NULL && clause_is_eq_clause (clause -> clause ))
652653{
653654i3 = -1 ;
654655foreach (l2 ,* args )