Re: [HACKERS] CONSTRAINTS... - Mailing list pgsql-hackers

From jwieck@debis.com (Jan Wieck)
Subject Re: [HACKERS] CONSTRAINTS...
Date
Msg-id m100sVO-000EBQC@orion.SAPserv.Hamburg.dsh.de
Whole thread Raw
In response to Re: [HACKERS] CONSTRAINTS...  (Vadim Mikheev <vadim@krs.ru>)
List pgsql-hackers
Vadim wrote:

>
> Jan Wieck wrote:
> >
> (Note that now in the case of UPDATE t_ctid of OLD tuples
> points to TID of NEW tuples.)
>
> Two things define data visibility: SnapShot & CommandId.
> We would have to save them for deffered rules and restore them
> before run rule actions. But there is one issue: for what
> scans old visibility should be used? There are scans from
> user query and there are scans added by rule action. Ok,
> let's assume that for added scans current visibility will be used
> - this is what we need for RI rules (actually, something more -
> see below).

    I  addressed  that problem (different visibility required for
    scans in one command) also in my other mail.

    Anyway, I just checked what happens in the following case:

        T1:  begin;
        T1:  select ...

        T2:  update ...

        T1:  select ... (gets the same (old) values)

    That's the result as long as T1 doesn't run in READ COMMITTED
    mode.   And  that's  fine,  because  it doesn't have to worry
    about concurrent transactions of others.

    So the only problem left is the different visability. I think
    it  is  possible  to  change the visibility code not to check
    against the global command counter. Instead it might look  at
    a  command  counter value in the range table entry related to
    the scan node.  So the rewrite system and  tcop  could  place
    the correct values there during query rewrite/processing.

    The   range  table  of  a  rules  rewritten  parsetree  is  a
    combination of the range tables from the original user query,
    applied  view  rules  and  the  the rule itself. For deferred
    rules, only the those coming with the rule action itself must
    have  the  command counter at COMMIT. All others must get the
    command counter value that is there when the query that fired
    this rule get's executed.

    The  deferred  querytrees  can first be held in a new list of
    the rewritten querytree for the original user statement.  The
    rewrite    system    puts   into   the   rangetable   entries
    USE_CURRENT_CMDID or USE_COMMIT_CMDID depending on where they
    are coming from.

    Before tcop calls the executor, a new function in the rewrite
    system is called to set the actual  values  for  the  command
    counter  to use into the rangetable entries for one query and
    it's deferred ones.  Then it adds all the deferred queries to
    the global deferred list and runs the query itself.

    At  commit  time,  when  all the deferred queries have to get
    run, those RTE's in them having USE_COMMIT_CMDID are  set  to
    the  command  counter  at  commit  before  running the plans.
    Voila.

> >     And  it's  a  problem I've came across just writing this note
> >     where MVCC already could  have  broken  rewrite  rule  system
> >     semantics.
>
> How?

    Yes it did!

    If a transaction runs in READ COMMITTED mode,  the  scan  for
    the  rules  actions  (performed  first)  could have different
    results than that for the original query (performed last).

    For now I see only one solution. READ COMMITTED is  forbidden
    for  anything that invokes non-view rules. This check must be
    done in the tcop and SPI, because saved SPI plans can be  run
    without  invoking the rewrite system at any time. So the plan
    must remember somewhere if READ COMMITTED is allowed  for  it
    or not.


Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#======================================== jwieck@debis.com (Jan Wieck) #

pgsql-hackers by date:

Previous
From: Vadim Mikheev
Date:
Subject: Re: [HACKERS] CONSTRAINTS...
Next
From: aldev
Date:
Subject: Re: [HACKERS] RPM maintainer?