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
