Re: How to make a OpExpr check compatible among different versions

Поиск
Список
Период
Сортировка
От Peter Eisentraut
Тема Re: How to make a OpExpr check compatible among different versions
Дата
Msg-id 7e9afcce-0223-f243-6854-0a8f6fe68a3c@2ndquadrant.com
обсуждение исходный текст
Ответ на How to make a OpExpr check compatible among different versions  (Andy Fan <zhihui.fan1213@gmail.com>)
Ответы Re: How to make a OpExpr check compatible among different versions
Список pgsql-hackers
On 2020-01-13 08:29, Andy Fan wrote:
> During one of my works for logical rewrite,  I want to check if the expr 
> is a given Expr.
> 
> so the simplest way is:
> if (expr->opno == 418 && nodeTag(linitial(expr->args)) == T_xxx  && 
> nodeTag(lsecond(expr->args)) == T_yyyy )
> {
>   ..
> }
> 
> if we write code like above,  we may have issues if the oid changed in 
> the future version.

Generally, you would do this by using a preprocessor symbol.  For 
example, instead of hardcoding the OID of the text type, you would use 
the symbol TEXTOID instead.  Symbols like that exist for many catalog 
objects that one might reasonably need to hardcode.

However, hardcoding an OID reference to an operator looks like a design 
mistake to me.  Operators should normally be looked up via operator 
classes or similar structures that convey the meaning of the operator.

Also, instead of nodeTag() == T_xxx you should use the IsA() macro.

-- 
Peter Eisentraut              http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Konstantin Knizhnik
Дата:
Сообщение: Re: [Proposal] Global temporary tables
Следующее
От: Amit Kapila
Дата:
Сообщение: Re: Comment fix in session.h