Re: Determining if a table really changed in a trigger

2021-11-06 Thread Mitar
Hi!

On Wed, Oct 27, 2021 at 12:46 AM Mark Dilger
 wrote:
> I felt the same way about it, but after glancing quickly through the code and 
> docs nothing jumped out.  The information is clearly available, as it gets 
> returned at the end of the UPDATE statement in the "UPDATE 0" OR "UPDATE 3", 
> but I don't see how to access that from the trigger.  I might have to submit 
> a patch for that if nobody else knows a way to get it.  (Hopefully somebody 
> will respond with the answer...?)

Anyone? Any way to determine the number of affected rows in a statement trigger?


Mitar

-- 
http://mitar.tnode.com/
https://twitter.com/mitar_m




Re: Question: Is it possible to get the new xlog position after query execution?

2021-11-06 Thread Peter J. Holzer
On 2021-11-01 00:36:16 -0400, Oleg Serov wrote:
> On Sun, Oct 31, 2021 at 4:29 PM Peter J. Holzer  wrote:
> 
> On 2021-10-29 13:22:56 -0400, Oleg Serov wrote:
> > We are using a master/slave replication system where we perform
> > writes on master and use replication to offload reads.
> >
> > However, sometimes we have a replication lag of a few seconds
> > and as a result, after the update, the change is not yet
> > available on the replica. 
> >
> > Is there a way to get XLOG position to which specific update
> > query will be written? That way we can check if our replica
> > caught up with changes and it is safe to read it from. Can it be
> > done using SQL functions? Can I get that information from query
> > protocol?
> 
> I think I would prefer a more direct approach:
> 
> If you know what you've written, can't you just check whether the
> replica has the new value(s)?
> 
> The simplest answer: One thread on a single process on a server knows about 
> it.
> Now another thread on another process/other server does not know about it.

So why would that other thread know the relevant XLOG position?


> If not, an alternative could be a table which contains a simple counter
> or timestamp:
> 
>     begin;
>     (lots of updates ...)
>     commit;
>     begin;
>     update counter set c = c + 1 returning c; -- save this as c_current
>     commit;
> 
>     Select c from counter on the replica in a loop until c >= c_current.
> 
> Why invent something totally new when XLOG position is already used for
> replication by postgres? What are the benefits of it?

Because you had to ask. That shows that it isn't obvious. So your
application relies on some non-obvious (and possibly version-dependent)
implementation details of the database to ensure ordering. Using
something that makes sense from the application perspective (a timestamp
or a counter are just examples - your application may already have some
information which can use be used for that purpose) makes it more
obvious for the application programmer. (I'm generally a big fan of
end-to-end checks and testing what you are really interested in. If want
X but argue that X is true if Y is true and Y is true if Z is true, and
then go on to test for Z, that usually makes code hard to understand. It
is sometimes useful or even necessary (e.g. if X cannot be tested
directly), but it should IMHO be restricted to those cases.)

hp

-- 
   _  | Peter J. Holzer| Story must make more sense than reality.
|_|_) ||
| |   | h...@hjp.at |-- Charles Stross, "Creative writing
__/   | http://www.hjp.at/ |   challenge!"


signature.asc
Description: PGP signature


Re: Determining if a table really changed in a trigger

2021-11-06 Thread Tom Lane
Mitar  writes:
> Anyone? Any way to determine the number of affected rows in a statement 
> trigger?

Check the size of the transition relation.

regards, tom lane




Re: Determining if a table really changed in a trigger

2021-11-06 Thread Mitar
Hi!

On Sat, Nov 6, 2021 at 2:43 PM Tom Lane  wrote:
> Mitar  writes:
> > Anyone? Any way to determine the number of affected rows in a statement 
> > trigger?
>
> Check the size of the transition relation.

Yes, this is what we are currently doing, but it looks very
inefficient if you want just the number, no? Or even if you want to
know if it is non-zero or zero.


Mitar

-- 
http://mitar.tnode.com/
https://twitter.com/mitar_m