Hello:
I looked into the source code, and I think I now understand it:
cmin and cmax are same! The documentation is too old now.

I made another test:
In terminal A:

pgsql=# begin;
BEGIN
pgsql=# select * from tab01;
 id | cd
----+----
(0 rows)

pgsql=# select xmin,xmax,cmin,cmax,* from tab01;
 xmin | xmax | cmin | cmax | id | cd
------+------+------+------+----+----
(0 rows)

pgsql=# insert into tab01 values(1,'1'),(2,'2'),(3,'3');
INSERT 0 3
pgsql=# insert into tab01 values(4,'4'),(5,'5'),(6,'6');
INSERT 0 3
pgsql=# select xmin,xmax,cmin,cmax,* from tab01;
 xmin | xmax | cmin | cmax | id | cd
------+------+------+------+----+----
 1897 |    0 |    0 |    0 |  1 | 1
 1897 |    0 |    0 |    0 |  2 | 2
 1897 |    0 |    0 |    0 |  3 | 3
 1897 |    0 |    1 |    1 |  4 | 4
 1897 |    0 |    1 |    1 |  5 | 5
 1897 |    0 |    1 |    1 |  6 | 6
(6 rows)

pgsql=# commit;

Then I begin to delete record:
pgsql=# begin;
BEGIN
pgsql=# delete from tab01 where id=1 or id=2;
DELETE 2
pgsql=# delete from tab01 where id=3;
DELETE 1
pgsql=# delete from tab01 where id=4;
DELETE 1
pgsql=# delete from tab01 where id=5;
DELETE 1
pgsql=#

But I have not commit my deleting action.
Then in terminal B, I can see:
pgsql=# select xmin,xmax,cmin,cmax,* from tab01;
 xmin | xmax | cmin | cmax | id | cd
------+------+------+------+----+----
 1897 | 1898 |    0 |    0 |  1 | 1
 1897 | 1898 |    0 |    0 |  2 | 2
 1897 | 1898 |    1 |    1 |  3 | 3
 1897 | 1898 |    2 |    2 |  4 | 4
 1897 | 1898 |    3 |    3 |  5 | 5
 1897 |    0 |    1 |    1 |  6 | 6
(6 rows)

pgsql=#

---------------
In fact , in the source code of PG,I can find it---heap_getsysattr function
in heaptuple.c,here is it:
--------code begin----

case MinCommandIdAttributeNumber:
case MaxCommandIdAttributeNumber:

/*
 * cmin and cmax are now both aliases for the same field, which
 * can in fact also be a combo command id. XXX perhaps we should
 * return the "real" cmin or cmax if possible, that is if we are
 * inside the originating transaction?
 */
result = CommandIdGetDatum(HeapTupleHeaderGetRawCommandId(tup->t_data));
break;

--------code end-------

2013/7/2 高健 <luckyjack...@gmail.com>

>  Hello:
>
>
> I have question for cmin and cmax.
>
> It is said:
>
> cmin    is:     The command identifier (starting at zero) within the
> inserting transaction.
>
> cmax   is:     The command identifier within the deleting transaction, or
> zero.
>
> http://www.postgresql.org/docs/9.1/static/ddl-system-columns.html
>
>
> But  I wonder what is the difference between cmin and cmax ?
>
> Because during my test, cmin and cmax changed together and be the same
> value:
>
>
> At first I have two records.
>
> In my terminal A I did:
>
>
> [postgres@server bin]$ ./psql
>
> psql (9.1.2)
>
> Type "help" for help.
>
>
>
> postgres=# select version();
>
>
> version
>
>
>
>
> --------------------------------------------------------------------------------
>
> -------------------------------
>
> PostgreSQL 9.1.2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2
> 20080
>
> 704 (Red Hat 4.1.2-52), 64-bit
>
> (1 row)
>
>
>
> postgres=# begin;
>
> BEGIN
>
> postgres=# select xmin,xmax,cmin,cmax,* from tab01;
>
> xmin | xmax | cmin | cmax | id | cd
>
> ------+------+------+------+----+----
>
> 1738 |    0 |    0 |    0 |  1 | 1
>
> 1739 |    0 |    0 |    0 |  2 | 2
>
> (2 rows)
>
>
>
> postgres=# insert into tab01 values(3,'3');
>
> INSERT 0 1
>
> postgres=# insert into tab01 values(4,'4');
>
> INSERT 0 1
>
> postgres=# insert into tab01 values(5,'5');
>
> INSERT 0 1
>
> postgres=# select xmin,xmax,cmin,cmax,* from tab01;
>
> xmin | xmax | cmin | cmax | id | cd
>
> ------+------+------+------+----+----
>
> 1738 |    0 |    0 |    0 |  1 | 1
>
> 1739 |    0 |    0 |    0 |  2 | 2
>
> 1740 |    0 |    0 |    0 |  3 | 3
>
> 1740 |    0 |    1 |    1 |  4 | 4
>
> 1740 |    0 |    2 |    2 |  5 | 5
>
> (5 rows)
>
>
>
> postgres=# update tab01 set id=50 where cd = '5';
>
> UPDATE 1
>
> postgres=# select xmin,xmax,cmin,cmax,* from tab01;
>
> xmin | xmax | cmin | cmax | id | cd
>
> ------+------+------+------+----+----
>
> 1738 |    0 |    0 |    0 |  1 | 1
>
> 1739 |    0 |    0 |    0 |  2 | 2
>
> 1740 |    0 |    0 |    0 |  3 | 3
>
> 1740 |    0 |    1 |    1 |  4 | 4
>
> 1740 |    0 |    3 |    3 | 50 | 5
>
> (5 rows)
>
>
>
> postgres=# delete from tab01 where id=4;
>
> DELETE 1
>
> postgres=# select xmin,xmax,cmin,cmax,* from tab01;
>
> xmin | xmax | cmin | cmax | id | cd
>
> ------+------+------+------+----+----
>
> 1738 |    0 |    0 |    0 |  1 | 1
>
> 1739 |    0 |    0 |    0 |  2 | 2
>
> 1740 |    0 |    0 |    0 |  3 | 3
>
> 1740 |    0 |    3 |    3 | 50 | 5
>
> (4 rows)
>
>
>
> postgres=# delete from tab01 where id=2;
>
> DELETE 1
>
> postgres=# select xmin,xmax,cmin,cmax,* from tab01;
>
> xmin | xmax | cmin | cmax | id | cd
>
> ------+------+------+------+----+----
>
> 1738 |    0 |    0 |    0 |  1 | 1
>
> 1740 |    0 |    0 |    0 |  3 | 3
>
> 1740 |    0 |    3 |    3 | 50 | 5
>
> (3 rows)
>
>
>
> postgres=#
>
>
>
>
>
> In terminal B, I did:
>
>
> [postgres@server bin]$ ./psql
>
> psql (9.1.2)
>
> Type "help" for help.
>
>
>
> postgres=# begin;
>
> BEGIN
>
>
>
> postgres=# select xmin,xmax,cmin,cmax,* from tab01;
>
> xmin | xmax | cmin | cmax | id | cd
>
> ------+------+------+------+----+----
>
> 1738 |    0 |    0 |    0 |  1 | 1
>
> 1739 | 1740 |    5 |    5 |  2 | 2
>
> (2 rows)
>
>
>
> postgres=#
>
>
> Thanks!
>

Reply via email to