Hi, I think I solved the problem in the parser and the planner, but I'm stuck in the executor, I think is in the ExecSort function on nodeSort around this code:
/* * Scan the subplan and feed all the tuples to tuplesort. */ for (;;) { slot = ExecProcNode(outerNode); if (TupIsNull(slot)) break; tuplesort_puttupleslot(tuplesortstate, slot); } Now, when the server get in that loop it hangs out, Would I have to add something that identifies the extra column? or will I have to include somewhere in the tuplesort the column? 2009/4/2 Werner Echezuria <werc...@gmail.com> > > Hi, the problem goes on. I think the problem is in the planner.c on > grouping_planner function, because when I do a regular sort it gets to it: > > /* > * If we were not able to make the plan come out in the right order, > add > * an explicit sort step. > */ > if (parse->sortClause) > { > if (!pathkeys_contained_in(sort_pathkeys, current_pathkeys)) > { > result_plan = (Plan *) make_sort_from_pathkeys(root, > result_plan, > sort_pathkeys, > limit_tuples); > current_pathkeys = sort_pathkeys; > } > } > > and do the make_sort_from_pathkeys, but when I do the sort by grmemb it > does not. So I change it in order to pass through make_sort_from_pathkey, > but it drops an error like this "invalid attnum", so when I go to heaptuple > and force to get to ObjectIdGetDatum in heap_getsysattr, the server hang > out. What can I do? How can I assign a valid attrnum? > > > 2009/4/1 Hitoshi Harada <umi.tan...@gmail.com> > >> 2009/4/1 Werner Echezuria <werc...@gmail.com>: >> >> > As you can see if someone do this: SELECT * FROM table WHERE >> > field=some_value ORDER BY grmemb, postgresql creates a new target entry >> and >> > then assigned to the targetlist as a sort node. I know that it creates >> the >> > node on the parser, but it does not work, it seems the executor don't >> see >> > it. >> >> See include/nodes/primnodes.h around line 1075: >> bool resjunk; /* set to true to eliminate >> the attribute from >> * final >> target list */ >> >> If the TargetEntry is set resjunk = false, the final result is >> filtered as junk. So more accurately the executor sees but drops it. >> >> > >> > How could I sort a column like this?, I know i'm missing something, but >> i >> > just don't see it. What is the process to sort a column? >> > >> >> Use makeTargetEntry in makefuncs.c >> TargetEntry * >> makeTargetEntry(Expr *expr, >> AttrNumber resno, >> char *resname, >> bool resjunk) >> >> by the 4th argument you can set resjunk = false if you don't want it >> to be in the result. >> >> Regards, >> >> >> -- >> Hitoshi Harada >> > >