Use one of not-null unique keys to identify rows when the target table doesn't
have a primary key. Some of users want to use not-null unique keys rather than primary keys because postgres doesn't support REINDEX PRIMARY KEY CONCURRENTLY. - Support 9.1dev. - Improve Makefile to use PGXS automatically.
This commit is contained in:
16
lib/Makefile
16
lib/Makefile
@ -9,13 +9,21 @@ MODULE_big = pg_reorg
|
||||
DATA_built = pg_reorg.sql
|
||||
DATA = uninstall_pg_reorg.sql
|
||||
|
||||
ifndef USE_PGXS
|
||||
top_builddir = ../../..
|
||||
makefile_global = $(top_builddir)/src/Makefile.global
|
||||
ifeq "$(wildcard $(makefile_global))" ""
|
||||
USE_PGXS = 1 # use pgxs if not in contrib directory
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef USE_PGXS
|
||||
PGXS := $(shell pg_config --pgxs)
|
||||
PG_CONFIG = pg_config
|
||||
PGXS := $(shell $(PG_CONFIG) --pgxs)
|
||||
include $(PGXS)
|
||||
else
|
||||
subdir = contrib/pg_reorg
|
||||
top_builddir = ../../..
|
||||
include $(top_builddir)/src/Makefile.global
|
||||
subdir = contrib/$(MODULE_big)
|
||||
include $(makefile_global)
|
||||
include $(top_srcdir)/contrib/contrib-global.mk
|
||||
endif
|
||||
|
||||
|
||||
@ -106,6 +106,20 @@ $$
|
||||
$$
|
||||
LANGUAGE sql STABLE STRICT;
|
||||
|
||||
-- includes not only PRIMARY KEYS but also UNIQUE NOT NULL keys
|
||||
CREATE VIEW reorg.primary_keys AS
|
||||
SELECT indrelid, (reorg.array_accum(indexrelid))[1] AS indexrelid
|
||||
FROM (SELECT indrelid, indexrelid FROM pg_index
|
||||
WHERE indisunique
|
||||
AND 0 <> ALL(indkey)
|
||||
AND NOT EXISTS(
|
||||
SELECT 1 FROM pg_attribute
|
||||
WHERE attrelid = indrelid
|
||||
AND attnum = ANY(indkey)
|
||||
AND NOT attnotnull)
|
||||
ORDER BY indrelid, indisprimary DESC, indnatts, indkey) tmp
|
||||
GROUP BY indrelid;
|
||||
|
||||
CREATE VIEW reorg.tables AS
|
||||
SELECT R.oid::regclass AS relname,
|
||||
R.oid AS relid,
|
||||
@ -127,10 +141,13 @@ CREATE VIEW reorg.tables AS
|
||||
'DELETE FROM reorg.log_' || R.oid || ' WHERE id <= $1' AS sql_pop
|
||||
FROM pg_class R
|
||||
LEFT JOIN pg_class T ON R.reltoastrelid = T.oid
|
||||
LEFT JOIN (SELECT * FROM pg_index WHERE indisprimary) PK
|
||||
LEFT JOIN reorg.primary_keys PK
|
||||
ON R.oid = PK.indrelid
|
||||
LEFT JOIN (SELECT CKI.* FROM pg_index CKI, pg_class CKT
|
||||
WHERE CKI.indexrelid = CKT.oid AND CKI.indisclustered AND CKT.relam = 403) CK
|
||||
WHERE CKI.indisvalid
|
||||
AND CKI.indexrelid = CKT.oid
|
||||
AND CKI.indisclustered
|
||||
AND CKT.relam = 403) CK
|
||||
ON R.oid = CK.indrelid
|
||||
LEFT JOIN pg_namespace N ON N.oid = R.relnamespace
|
||||
LEFT JOIN pg_tablespace S ON S.oid = R.reltablespace
|
||||
|
||||
@ -151,6 +151,12 @@ extern void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc,
|
||||
|
||||
#endif
|
||||
|
||||
#if PG_VERSION_NUM < 90100
|
||||
|
||||
#define ATExecChangeOwner(relationOid, newOwnerId, recursing, lockmode) \
|
||||
ATExecChangeOwner((relationOid), (newOwnerId), (recursing))
|
||||
#endif
|
||||
|
||||
#if PG_VERSION_NUM < 80300
|
||||
#define RelationSetNewRelfilenode(rel, xid) \
|
||||
setNewRelfilenode((rel))
|
||||
|
||||
@ -766,7 +766,7 @@ reorg_swap(PG_FUNCTION_ARGS)
|
||||
/* change owner of new relation to original owner */
|
||||
if (owner1 != owner2)
|
||||
{
|
||||
ATExecChangeOwner(oid2, owner1, true);
|
||||
ATExecChangeOwner(oid2, owner1, true, AccessExclusiveLock);
|
||||
CommandCounterIncrement();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user