Re: To know what a macro does
| От | Werner Echezuria |
|---|---|
| Тема | Re: To know what a macro does |
| Дата | |
| Msg-id | 2485a25e0904261803s1ab6714te4b3b0a2b4a9d24c@mail.gmail.com обсуждение исходный текст |
| Ответ на | Re: To know what a macro does (Martijn van Oosterhout <kleptog@svana.org>) |
| Ответы |
Re: To know what a macro does
Re: To know what a macro does |
| Список | pgsql-hackers |
Well, I do a query like this: "SELECT * FROM historial WHERE id_grupo=grupo_hist ORDER BY grmemb LIMIT 10;", then in
transformSortClauseI know it this way:<br /><br /> /*<br /> * transformSortClause -<br /> * transform an ORDER BY
clause<br/> *<br /> * ORDER BY items will be added to the targetlist (as resjunk columns)<br /> * if not already
present,so the targetlist must be passed by reference.<br /> */<br />List *<br />transformSortClause(ParseState
*pstate,<br/> List *orderlist,<br /> List **targetlist,<br />
boolresolveUnknown)<br />{<br /> List *sortlist = NIL;<br /> ListCell *olitem;<br /><br />
foreach(olitem,orderlist)<br /> {<br /> SortBy *sortby = lfirst(olitem);<br /> TargetEntry
*tle;<br/> //To find out if it is the membership degree<br /> char *namegrmemb =
strVal(linitial(((ColumnRef*) sortby->node)->fields));<br /><br /> <b>if (strcmp(namegrmemb,
"grmemb")==0)<br/></b> tle = createTargetFuzzyEntry(targetlist);<br /> else<br /> tle =
findTargetlistEntry(pstate,sortby->node,<br /> targetlist, ORDER_CLAUSE);<br
/><br/> sortlist = addTargetToSortList(pstate, tle,<br /> sortlist,
*targetlist,<br/> sortby->sortby_dir,<br />
sortby->sortby_nulls,<br /> sortby->useOp,<br />
resolveUnknown);<br /> <br /> <br /><br /> }<br /><br /> return sortlist;<br />}<br
/><br
/>|***************************************************************************************************************************|<br
/><br/>Then I created a function that includes a new target entry in the targetlist:<br /><br />//To sort the
membershipdegree<br />TargetEntry *<br />createTargetFuzzyEntry(List **targetlist){<br /> <br /> /*I just have to
createthe fuzzy target entry right here */<br /> TargetEntry *tfp = makeNode(TargetEntry);<br /> Const *cn
=makeNode(Const);<br /> float val = 1.0;<br /> TargetEntry *tlast = list_nth(*targetlist,
list_length(*targetlist)-1);<br/><br /> cn = makeConst(700, -1, 4, (Float4GetDatum(val)), false, true); <br />
tfp->resorigtbl=tlast->resorigtbl;<br/> tfp->expr = (Expr *) cn;<br /> tfp->resno =
list_length(*targetlist)+ 1;<br /> tfp->resname = "grmemb";<br /> tfp->resorigcol =
list_length(*targetlist)+ 1;<br /> tfp->ressortgroupref = 0;<br /> tfp->resjunk = false;<br /><br />
*targetlist= lappend(*targetlist, tfp);<br /><br /> return tfp;<br />}<br /><br
/>|*************************************************************************************************************************|<br
/><br/>Later in planner.c on grouping_planner function I do something like this:<br /><br />/*<br /> * If we were
notable to make the plan come out in the right order, add<br /> * an explicit sort step.<br /> */<br /> if
(parse->sortClause)<br/> {<br /> if (!pathkeys_contained_in(sort_pathkeys, current_pathkeys) ||
parse->hasGrMemb)<br/> {<br /> result_plan = (Plan *) make_sort_from_pathkeys(root,<br />
result_plan,<br />
sort_pathkeys,<br /> limit_tuples);<br />
current_pathkeys = sort_pathkeys;<br /> }<br /> }<br /><br /><br /><div class="gmail_quote">2009/4/26
Martijnvan Oosterhout <span dir="ltr"><<a href="mailto:kleptog@svana.org">kleptog@svana.org</a>></span><br
/><blockquoteclass="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex;
padding-left:1ex;"><div class="im">On Sun, Apr 26, 2009 at 04:20:41PM -0430, Werner Echezuria wrote:<br /> > Hi,
I'vebeen trying to sort a column that performs some calculations, but<br /> > postgres says this: ERROR: invalid
attnum:-12851. I was searching on the<br /> > source code, and I guess the error araises around this macro:<br /><br
/></div>I'mpretty sure this is a "not supposed to happen" thing. Do you have a<br /> repoducable test case? Also, what
versionof postgres?<br /><div class="im"><br /> > /*<br /> > * Copy the given tuple into memory we control,
anddecrease availMem.<br /> > * Then call the common code.<br /> > */<br /> > COPYTUP(state,
&stup,(void *) slot);<br /> ><br /> > So, I'd like to know what COPYTUP does?, what is availMem?, How can I
tell<br/> > postgres it is a valid attnum?<br /><br /></div>COPYTUP does exactly what the comment says it does. I'm
guessingthis<br /> is in the sort code somewhere? An "attnum" is a column number, like the<br /> first column is attnum
1.Attnum -12851 is definitly bogus.<br /><br /> Have a nice day,<br /><font color="#888888">--<br /> Martijn van
Oosterhout <<a href="mailto:kleptog@svana.org">kleptog@svana.org</a>> <a href="http://svana.org/kleptog/"
target="_blank">http://svana.org/kleptog/</a><br/> > Please line up in a tree and maintain the heap invariant
while<br/> > boarding. Thank you for flying nlogn airlines.<br /></font><br />-----BEGIN PGP SIGNATURE-----<br />
Version:GnuPG v1.4.9 (GNU/Linux)<br /><br /> iD8DBQFJ9M7xIB7bNG8LQkwRAviuAJ9F9GeldnVLInum3ZaT0IKTNvk3dACdElyo<br />
7VZ7cLAgu1q4PncHS8rVYJU=<br/> =Y5Qw<br /> -----END PGP SIGNATURE-----<br /><br /></blockquote></div><br />
В списке pgsql-hackers по дате отправления: