2014-07-04 8:17 GMT-03:00 Bruno Silva <[email protected]>:

> Mas foi bem interessante olhar o código do Postgres, ainda não tinha visto.
> Matheus, é desse trecho que você fala né?
> | a_expr BETWEEN opt_asymmetric b_expr AND b_expr       %prec BETWEEN
> 11055
> <http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/parser/gram.y;h=ba7d091dc793c079481a9a0fab05a110c8e98ce7;hb=HEAD#l11055>
>                 {
> 11056
> <http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/parser/gram.y;h=ba7d091dc793c079481a9a0fab05a110c8e98ce7;hb=HEAD#l11056>
>                     $$ = makeAndExpr(
> 11057
> <http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/parser/gram.y;h=ba7d091dc793c079481a9a0fab05a110c8e98ce7;hb=HEAD#l11057>
>                         (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $4, @2),
> 11058
> <http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/parser/gram.y;h=ba7d091dc793c079481a9a0fab05a110c8e98ce7;hb=HEAD#l11058>
>                         (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $6, @2),
> 11059
> <http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/parser/gram.y;h=ba7d091dc793c079481a9a0fab05a110c8e98ce7;hb=HEAD#l11059>
>                                      @2);
> 11060
> <http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/parser/gram.y;h=ba7d091dc793c079481a9a0fab05a110c8e98ce7;hb=HEAD#l11060>
>                 }
>
>
Sim. Veja que ele, logo no parser, converte a expressão `x BETWEEN y AND z`
para os pares `x >= y AND x <= z`. Os valores do cifrão são posicionais,
daí $1 = a_expr (x), $2 = BETWEEN, $3 = opt_asymetric, $4 = b_expr (y), $5
= AND, $6 = b_expr (z). Daí o makeSimpleA_Expr cri as expressões `x >= y`
(linha 11057) e `x <= z` (linha 11058) e a chamada de fora do makeAndExpr
(11056) "junta" essas duas num AND. O $$ podemos pensar como um retorno
feito nessa parte do parser, como se esse bloco fosse uma função e o $$
fosse o return dela (não é exatamente isso, mas seria uma mapeamento
razoável).

É interessante dar uma olhada no código quando esse tipo de dúvida surge.
Eu já havia buscado essa há um tempo durante um treinamento, exatamente
para dirimir dúvidas que surgiram sobre a diferença entre usar BETWEEN os
pares >= e <=.

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a