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
(Martijn van Oosterhout <kleptog@svana.org>)
Re: To know what a macro does (Tom Lane <tgl@sss.pgh.pa.us>) |
Список | 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 по дате отправления: