Operadores

Procedimiento de conversi�n

Operador de evaluaci�n

  1. Inspecciona en busca de un ajuste exacto en el cat�logo del sistema pg_operator.

    1. Si un argumento de un operador binario es unknown, entonces se asume que es del mismo tipo que el otro argumento.

    2. Invierte los argumentos, y busca un ajuste exacto con un operador el cual apunta a �l mismo ya que es conmutativo. Si lo halla, entonces invierte los argumentos en el �rbol del analizador y usa este operador.

  2. Busca el mejor ajuste.

    1. Hace una lista de todos los operadores con el mismo nombre.

    2. Si solo hay un operador en la lista usa este si el tipo de la entrada puede ser forzado, y genera un error si el tipo no puede ser forzado.

    3. Guarda todos los operadores con los ajustes m�s expl�citos de tipos. Guarda todo si no hay ajustes expl�citos y salta al siguiente paso. Si solo queda un candidato, usa este si el tipo puede ser forzado.

    4. Si alg�n argumento de entrada es "unknown", categoriza los candidatos de entrada como boolean, numeric, string, geometric, o user-defined. Si hay una mezcla de categor�as, o m�s de un tipo definido por el usuario, genera un error porque la elecci�n correcta no puede ser deducida sin m�s pistas. Si solo est� presente una categor�a, entonces asigna el tipo preferido a la columna de entrada que previamente era "unknown".

    5. Escoge el candidato con los ajustes de tipos m�s exactos, y que ajustan el "tipo preferido" para cada categor�a de columna del paso previo. Si todav�a queda m�s de un candidato, o si no queda ninguno, entonces se genera un error.

Ejemplos

Operador exponente

Solo hay un operador exponente definido en el cat�logo, y toma argumentos float8. El examinador asigna un tipo inicial int4 a ambos argumentos en la expresi�n de esta consulta:

tgl=> select 2 ^ 3 AS "Exp";
Exp
---
  8
(1 row)
De esta manera, el analizador hace una conversi�n de tipo sobre ambos operadores y la consulta es equivalente a
tgl=> select float8(2) ^ float8(3) AS "Exp";
Exp
---
  8
(1 row)
or
tgl=> select 2.0 ^ 3.0 AS "Exp";
Exp
---
  8
(1 row)

Nota

Esta ultima forma es la que tiene menos sobrecarga, ya que no se llama a funciones para hacer un conversi�n impl�cita de tipo. Esto no es una ventaja para peque�as consultas, pero puede tener un gran impacto en el rendimiento de consultas que abarquen muchas tablas.

Concatenaci�n de cadenas

Una sintaxis similar es usada tanto para trabajar con tipos alfanum�ricos como con tipos complejos extendidos. Las cadenas alfanum�ricas con tipo sin especificar son ajustadas con los operadores candidatos afines.

Un argumento sin especificar:

tgl=> SELECT text 'abc' || 'def' AS "Text and Unknown";
Text and Unknown
----------------
abcdef
(1 row)

En este caso el analizador mira si existe alg�n operador que necesite el operador text en ambos argumentos. Si existe, asume que el segundo operador debe ser interpretado como de tipo text.

Concatenaci�n con tipos sin especificar:

tgl=> SELECT 'abc' || 'def' AS "Unspecified";
Unspecified
-----------
abcdef
(1 row)

En este caso hay ninguna pista inicial sobre que tipo usar, ya que no se han especificado tipos en la consulta. De esta manera, el analizador busca en todos los operadores candidatos aquellos en los que todos los argumentos son de tipo alfanum�rico. Elige el "tipo preferido" para las cadenas alfanum�ricas, text, para esta consulta.

Nota

Si un usuario define un nuevo tipo y define un operador "||" para trabajar con el, entonces esta consulta tal como esta escrita no tendr� �xito. El analizador tendr�a ahora tipos candidatos de dos categor�as, y no podr�a decidir cual de ellos usar.

Factorial

Este ejemplo ilustra un interesante resultado. Tradicionalmente, el operador factorial est� definido solo para enteros. El catalogo de operadores de Postgres tiene solamente una entrada para el factorial, que toma un entero como operador. Si recibe un argumento num�rico no entero, Postgres intentar� convertir este argumento a un entero para la evaluaci�n del factorial.

tgl=> select (4.3 !);
?column?
--------
      24
(1 row)

Nota

Por supuesto, esto conduce a un resultado matem�ticamente sospechoso, debido a que en principio el factorial de un n�mero no entero no est� definido. De cualquier modo, el papel de una base de datos no es ense�ar matem�ticas, sino m�s bien ser una herramienta para manipular datos. Si un usuario decide obtener en factorial de un n�mero real, Postgres intentar� hacerlo.