Пример #1
0
    def internal_test_reindex(self, name, sql):
        c = self.db.cursor()
        # Create index
        c.execute(sql)
        oid1 = get_rel_oid(c, name)
        stmt1 = fetch_single_val(c, "SELECT pg_get_indexdef(%s, 0, false)", [oid1])

        # Recreate index
        pgtool.pg_reindex(self.db, name)
        oid2 = get_rel_oid(c, name)
        stmt2 = fetch_single_val(c, "SELECT pg_get_indexdef(%s, 0, false)", [oid2])
        self.assertTrue(oid2 > 0)

        # New oid must be allocated for the new index
        self.assertNotEqual(oid1, oid2)
        # But index expressions must remain equal
        self.assertEqual(stmt1, stmt2)
Пример #2
0
    def test_reindex_recovery(self):
        """Test error recovery when reindex fails"""
        c = self.db.cursor()
        # Create invalid index. DataError: invalid input syntax for integer: "a"
        with self.assertRaises(psycopg2.DataError):
            c.execute("CREATE INDEX CONCURRENTLY reindex_idx2 ON reindex_tbl((txt::int))")
        oid1 = get_rel_oid(c, "reindex_idx2")

        # Reindex fails too
        with self.assertRaises(psycopg2.DataError):
            pgtool.pg_reindex(self.db, "reindex_idx2")
        oid2 = get_rel_oid(c, "reindex_idx2")

        # Make sure the index wasn't replaced or dropped
        self.assertEqual(oid1, oid2)

        # Make sure we didn't leave behind an invalid index
        c.execute(
            """\
        SELECT array_agg(indexrelid::regclass::text) FROM pg_catalog.pg_index
            WHERE indrelid='pgtool_test.reindex_tbl'::regclass AND NOT indisvalid
        """
        )
        self.assertEqual(c.fetchone()[0], ["reindex_idx2"])