Thread: INSERT RULE

INSERT RULE

From
Pailloncy Jean-Gérard
Date:
Hi,

I test a configuration where one table is divided in 256 sub-table.
And I use a RULE to offer a single view to the data.

For INSERT I have create 256 rules like:
CREATE RULE ndicti_000 AS ON INSERT TO ndict
     WHERE (NEW.word_id & 255) = 000 DO INSTEAD
     INSERT INTO ndict_000 VALUES( NEW.url_id, 000, NEW.intag);
CREATE RULE ndicti_001 AS ON INSERT TO ndict
     WHERE (NEW.word_id & 255) = 001 DO INSTEAD
     INSERT INTO ndict_001 VALUES( NEW.url_id, 001, NEW.intag);
And that works, a bit slow.

I try to do:
CREATE RULE ndicti AS ON INSERT TO ndict
     DO INSTEAD INSERT INTO 'ndict_' || (NEW.word_id & 255)
     VALUES( NEW.url_id, NEW.word_id, NEW.intag);
I got an error on 'ndict_' .
I did not found the right syntax.

Any help is welcomed.


Cordialement,
Jean-Gérard Pailloncy

Re: INSERT RULE

From
Pailloncy Jean-Gérard
Date:
> I try to do:
> CREATE RULE ndicti AS ON INSERT TO ndict
>     DO INSTEAD INSERT INTO 'ndict_' || (NEW.word_id & 255)
>     VALUES( NEW.url_id, NEW.word_id, NEW.intag);
> I got an error on 'ndict_' .
> I did not found the right syntax.
In fact I discover that
SELECT * FROM / INSERT INTO table
doesn't accept function that returns the name of the table as table,
but only function that returns rows....

I'm dead.

Does this feature, is possible or plan ?
Is there a trick to do it ?

Cordialement,
Jean-Gérard Pailloncy


Re: INSERT RULE

From
Richard Huxton
Date:
Pailloncy Jean-Gérard wrote:
>> I try to do:
>> CREATE RULE ndicti AS ON INSERT TO ndict
>>     DO INSTEAD INSERT INTO 'ndict_' || (NEW.word_id & 255)
>>     VALUES( NEW.url_id, NEW.word_id, NEW.intag);
>> I got an error on 'ndict_' .
>> I did not found the right syntax.
>
> In fact I discover that
> SELECT * FROM / INSERT INTO table
> doesn't accept function that returns the name of the table as table, but
> only function that returns rows....
>
> I'm dead.
>
> Does this feature, is possible or plan ?
> Is there a trick to do it ?

You could call a plpgsql function and inside that use EXECUTE (or use
pltcl or some other interpreted language).

Not sure what you're doing will help you much though. Are you aware that
you can have partial indexes?

CREATE INDEX i123 ON ndict WHERE (word_id & 255)=123;

That might be what you're after, but it's difficult to be sure without
knowing what problem you're trying to solve.
--
   Richard Huxton
   Archonet Ltd