Thread: Re: Error trying to create a functional index.

Re: Error trying to create a functional index.

From
CoL
Date:
Steve: of course you can make functional indices:

So why this not workin???? (not workin for me 2 too, pg 7.1.3)
"CREATE INDEX eventdateindex ON event (date_trunc('day', eventstamp));"

----------------
7.5. Functional Indices
For a functional index, an index is defined on the result of a function 
applied to one or more columns of a single table. Functional indices can 
be used to obtain fast access to data based on the result of function calls.
For example, a common way to do case-insensitive comparisons is to use 
the lower:
SELECT * FROM test1 WHERE lower(col1) = 'value';
In order for that query to be able to use an index, it has to be defined 
on the result of the lower(column) operation:
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
The function in the index definition can take more than one argument, 
but they must be table columns, not constants. Functional indices are 
always single-column (namely, the function result) even if the function 
uses more than one input field; there cannot be multi-column indices 
that contain function calls.
Tip: The restrictions mentioned in the previous paragraph can easily be 
worked around by defining custom functions to use in the index 
definition that call the desired function(s) internally.
----------------

Steve Brett wrote:

> i think you need to do this
> 
> CREATE INDEX eventdateindex ON event (eventstamp);
> 
> as i'm 99% certain that you can only create an index on a 'whole' attribute
> and not the result of a function.
> 
> Steve
> 
> "Neal Lindsay" <chox65@yahoo.com> wrote in message
> news:b01eaea0.0201030725.51661db3@posting.google.com...
> 
>>I have a table called "event":
>>  Attribute  |           Type           |
>>Modifier
>>-------------+--------------------------+---------------------------------
>>
> ----------------------
> 
>> eventid     | integer                  | not null default
>>nextval('"event_eventid_seq"'::text)
>> femployeeid | integer                  | not null
>> ftaskid     | integer                  | not null
>> flocaleid   | integer                  | not null
>> eventstamp  | timestamp with time zone | not null
>> duration    | smallint                 | not null
>>Index: event_pkey
>>
>>When I try to create an index:
>>CREATE INDEX eventdateindex ON event (date_trunc('day', eventstamp));
>>
>>It gives me this error:
>>ERROR:  parser: parse error at or near "'"
>>
>>I can "SELECT date_trunc('day', eventstamp) FROM event;", but not
>>create an index on that function.  What am I doing wrong?
>>
>>Thanks
>>-Neal Lindsay
>>
> 
> 



Re: Error trying to create a functional index.

From
CoL
Date:
Hi,

Jochem van Dieten wrote:

> CoL wrote:
> 
>> Steve: of course you can make functional indices:
>>
>> So why this not workin???? (not workin for me 2 too, pg 7.1.3)
>> "CREATE INDEX eventdateindex ON event (date_trunc('day', eventstamp));"
>>
> 
> Wouldn't your problem be that 'day' is a constant?
> Jochem

sure it is, but date_trunc takes this, so what is the way to create a date_trunc part or any 

date function index on a timestamp?

Or it's not possible?

CoL




Re: Error trying to create a functional index.

From
Jochem van Dieten
Date:
CoL wrote:

> Steve: of course you can make functional indices:
> 
> So why this not workin???? (not workin for me 2 too, pg 7.1.3)
> "CREATE INDEX eventdateindex ON event (date_trunc('day', eventstamp));"
> 
> ----------------
> 7.5. Functional Indices
> For a functional index, an index is defined on the result of a function 
> applied to one or more columns of a single table. Functional indices can 
> be used to obtain fast access to data based on the result of function 
> calls.
> For example, a common way to do case-insensitive comparisons is to use 
> the lower:
> SELECT * FROM test1 WHERE lower(col1) = 'value';
> In order for that query to be able to use an index, it has to be defined 
> on the result of the lower(column) operation:
> CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
> The function in the index definition can take more than one argument, 
> but they must be table columns, not constants.


Wouldn't your problem be that 'day' is a constant?

Jochem



Re: Error trying to create a functional index.

From
Jochem van Dieten
Date:
CoL wrote:

> 
> sure it is, but date_trunc takes this, so what is the way to create a 
> date_trunc part or any date function index on a timestamp?
> 
> Or it's not possible?


I would tend to believe it is not directly possible. But maybe with a 
custom function:

(pseudocode, check whether Day is a reserved word)
CREATE FUNCTION Day(date) RETURNS varchar AS '
BEGIN  RETURN Cast(date_trunc('day', $1) AS varchar);
END;
' LANGUAGE 'SQL';

CREATE INDEX eventdateindex ON event (Day(eventstamp));

SELECT Day(eventstamp) FROM event;


Jochem