Raw constraint & pg_relcheck.rcsrc

Started by Hiroshi Inoueover 25 years ago6 messages
#1Hiroshi Inoue
Inoue@tpf.co.jp

Hi all,

I have a question.
As far as I see,constraints are stored into PG database ordinarily
as follows.

1) RelationAddRawConstraints() converts each raw constaint
to bin form.
2) StoreRelCheck() converts the bin form to src form and store
them into pg_relcheck tuples.

Is pg_relcheck.rcsrc equivalent to the original raw constraint ?

Regards.

Hiroshi Inoue
Inoue@tpf.co.jp

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Hiroshi Inoue (#1)
Re: Raw constraint & pg_relcheck.rcsrc

"Hiroshi Inoue" <Inoue@tpf.co.jp> writes:

Is pg_relcheck.rcsrc equivalent to the original raw constraint ?

To the best of deparse_expression()'s ability, it should be.
I'm not real sure why we bother to store it, rather than deparsing
rcbin on-the-fly on demand...

regards, tom lane

#3Hiroshi Inoue
Inoue@tpf.co.jp
In reply to: Tom Lane (#2)
RE: Raw constraint & pg_relcheck.rcsrc

-----Original Message-----
From: Tom Lane [mailto:tgl@sss.pgh.pa.us]

"Hiroshi Inoue" <Inoue@tpf.co.jp> writes:

Is pg_relcheck.rcsrc equivalent to the original raw constraint ?

To the best of deparse_expression()'s ability, it should be.
I'm not real sure why we bother to store it, rather than deparsing
rcbin on-the-fly on demand...

I'm looking at DefineRelation() in commands/creartinh.c.
In case of inheritance,constraints of super classes are
stored using their pg_relcheck.rcbin-s. It seems bad
in case of multiple inheritance. rcsrc-s may be available
instead.

Comments ?

Regards.

Hiroshi Inoue
Inoue@tpf.co.jp

#4Hiroshi Inoue
Inoue@tpf.co.jp
In reply to: Hiroshi Inoue (#3)
RE: Raw constraint & pg_relcheck.rcsrc

-----Original Message-----
From: Hiroshi Inoue [mailto:Inoue@tpf.co.jp]

-----Original Message-----
From: Tom Lane [mailto:tgl@sss.pgh.pa.us]

"Hiroshi Inoue" <Inoue@tpf.co.jp> writes:

Is pg_relcheck.rcsrc equivalent to the original raw constraint ?

To the best of deparse_expression()'s ability, it should be.
I'm not real sure why we bother to store it, rather than deparsing
rcbin on-the-fly on demand...

I'm looking at DefineRelation() in commands/creartinh.c.
In case of inheritance,constraints of super classes are
stored using their pg_relcheck.rcbin-s. It seems bad
in case of multiple inheritance. rcsrc-s may be available
instead.

Oops,I've been completely off the point.
The raw expression of constraints seems to be really needed.

Is there any way to convert rcbin(cooked text format) to the
raw(pre-cooked) Node expression ? Or is there a way to
convert rcsrc to the pre-cooked Node expression ?
Or is there a way to convert rcsrc to the cooked expression ?

Here's a simple bug case.

=# create table p1 (id int4);
CREATE
=# create table p2 (dt text check (dt = 'a'));
CREATE
=# create table inh () inherits (p1,p2);
CREATE
=# \d inh
Table "inh"
Attribute | Type | Modifier
-----------+---------+----------
id | integer |
dt | text |
Constraint: (id = 'a'::text)

Regards.

Hiroshi Inoue
Inoue@tpf.co.jp

#5Tom Lane
tgl@sss.pgh.pa.us
In reply to: Hiroshi Inoue (#4)
Re: Raw constraint & pg_relcheck.rcsrc

"Hiroshi Inoue" <Inoue@tpf.co.jp> writes:

Is there any way to convert rcbin(cooked text format) to the
raw(pre-cooked) Node expression?

No.

Or is there a way to
convert rcsrc to the pre-cooked Node expression ?
Or is there a way to convert rcsrc to the cooked expression ?

I think what you'd have to do is take the parent's rcsrc and run it
through the parse and transform phases again, using the new child
table as the reference for attribute name resolution. Thomas might
have a clearer idea than I do about the cleanest way to interface
to the parser for that.

Another possibility is to determine the mapping from parent columns
to child columns, and then walk through the (cooked) expression tree
and substitute varattno field values in Var nodes accordingly. I'm
not certain that's sufficient, but if it is it'd be a fairly small
amount of code (in fact you might be able to just call the routines in
the rewriter that do similar things).

regards, tom lane

#6Hiroshi Inoue
Inoue@tpf.co.jp
In reply to: Tom Lane (#5)
RE: Raw constraint & pg_relcheck.rcsrc

-----Original Message-----
From: Tom Lane

"Hiroshi Inoue" <Inoue@tpf.co.jp> writes:

Is there any way to convert rcbin(cooked text format) to the
raw(pre-cooked) Node expression?

No.

Or is there a way to
convert rcsrc to the pre-cooked Node expression ?
Or is there a way to convert rcsrc to the cooked expression ?

[snip]

Another possibility is to determine the mapping from parent columns
to child columns, and then walk through the (cooked) expression tree
and substitute varattno field values in Var nodes accordingly. I'm
not certain that's sufficient, but if it is it'd be a fairly small
amount of code (in fact you might be able to just call the routines in
the rewriter that do similar things).

OK,I would try this way using expression_tree_walker() which I
used once in my trial for ALTER TABLE DROP COLUMN.

Thanks.

Hiroshi Inoue
Inoue@tpf.co.jp