Re: Index not used with IS NULL
| От | Tom Lane | 
|---|---|
| Тема | Re: Index not used with IS NULL | 
| Дата | |
| Msg-id | 8934.1045497174@sss.pgh.pa.us обсуждение исходный текст  | 
		
| Ответ на | Re: Index not used with IS NULL (Dmitry Tkach <dmitry@openratings.com>) | 
| Ответы | 
                	
            		Re: Index not used with IS NULL
            		
            		 Re: Index not used with IS NULL  | 
		
| Список | pgsql-general | 
Dmitry Tkach <dmitry@openratings.com> writes:
> Tom Lane wrote:
>> I don't see anything dangerous about it --- except perhaps to
>> readability and mantainability of the code.  The problem is that IS NULL
>> doesn't fit into the operator-and-opclass model of what indexes can do.
>> If you can find a solution to that problem that's not a complete kluge,
>> I'm all ears.
> Well... At first glance, it seems that what needs to be done is:
> - add a special case in is_indexable_operator() to return true for IS_NULL
And is_indexable_operator() will know that this is safe how?  Or do you
plan to fix the other three index types to support NULLs too?
> - modify _bt_checkkeys () to return isNull  from inside if
> (key->sk_flags & SK_ISNULL) clause instead of just false.
> - remove sk_flags & SK_ISNULL checks from _bt_orderkeys
IIRC, SK_ISNULL marks that the value being compared against is null
--- not that the scan operator is ISNULL.  An approach as above would
cause "WHERE x = something" indexscans to start returning nulls if the
"something" is null, no?  You need a representation that preserves the
difference between "x = NULL" and "x IS NULL".  The ScanKey structure
can't do this at the moment, mainly because it assumes that the scan
operator *is* an operator.  Which IS NULL is not.
            regards, tom lane
		
	В списке pgsql-general по дате отправления: