RedHat6.0 & Alpha
От | Uncle George |
---|---|
Тема | RedHat6.0 & Alpha |
Дата | |
Msg-id | 3793C0F6.3ECB814E@voicenet.com обсуждение исходный текст |
Ответы |
Re: [HACKERS] RedHat6.0 & Alpha
Re: [PORTS] RedHat6.0 & Alpha |
Список | pgsql-hackers |
In the regression test rules.sql there is this SQL command update rtest_v1 set a = rtest_t3.a + 20 where b = rtest_t3.b; Which causes my alpha port to go core. The above line can be reduced to: update rtest_v1 set a = rtest_t3.a + 20 ; which also causes the same problem. It seems that the 64 bit address ((Expr*)nodeptr)->oper gets truncated ( high 32 bits ) somewhere along the way. I was able to locate the errant code in rewriteManip.c:712. but There seems to be a bigger problem other than eraseing the upper 32bit address. It seems that FindMatchingNew() returns a node of type T_Expr, rather than the expected type of T_Var. Once u realize this then u can see why the now MISCAST "(Var *) *nodePtr)->varlevelsup = this_varlevelsup" will cause a problem. On my alpha this erases a portion in the address in the T_Expr. On the redhat 5.2/i386 this code seems to be benign, BUT YOU ARE ERASEING SOMETHING that doesn't belong to to T_Expr ! So what gives? gat Maybe an assert() will help in finding some of the miscast returned types? Wuddya think? sure would catch some of the boo-boo's hanging around rewriteManip.c: if (this_varno == info->new_varno && this_varlevelsup == sublevels_up) { n = FindMatchingNew(targetlist, ((Var *) node)->varattno); if (n == NULL) { if (info->event == CMD_UPDATE) { *nodePtr = n = copyObject(node); ((Var *) n)->varno = info->current_varno; ((Var *) n)->varnoold = info->current_varno; } else *nodePtr = make_null(((Var *) node)->vartype); } else { *nodePtr = copyObject(n); ((Var *) *nodePtr)->varlevelsup = this_varlevelsup; /* This line zaps the address */ } }
В списке pgsql-hackers по дате отправления: