*/
    if (objectKind == REINDEX_OBJECT_SCHEMA)
    {
-       scan_keys = palloc(sizeof(ScanKeyData) * 2);
+       /*
+        * Return all objects in schema. We filter out
+        * inappropriate objects as we walk through results.
+        */
+       num_keys = 1;
+       scan_keys = palloc(sizeof(ScanKeyData));
        ScanKeyInit(&scan_keys[0],
                    Anum_pg_class_relnamespace,
                    BTEqualStrategyNumber, F_OIDEQ,
                    ObjectIdGetDatum(objectOid));
-       ScanKeyInit(&scan_keys[1],
-                   Anum_pg_class_relkind,
-                   BTEqualStrategyNumber, F_CHAREQ,
-                   'r');
-       num_keys = 2;
    }
    else
        num_keys = 0;
        Form_pg_class classtuple = (Form_pg_class) GETSTRUCT(tuple);
        Oid         relid = HeapTupleGetOid(tuple);
 
+       /*
+        * Only regular tables and matviews can have indexes,
+        * so filter out any other kind of object.
+        */
        if (classtuple->relkind != RELKIND_RELATION &&
            classtuple->relkind != RELKIND_MATVIEW)
            continue;
 
 REINDEX SCHEMA schema_to_reindex; -- failure, schema does not exist
 ERROR:  schema "schema_to_reindex" does not exist
 CREATE SCHEMA schema_to_reindex;
-CREATE TABLE schema_to_reindex.table1(col1 SERIAL PRIMARY KEY);
-CREATE TABLE schema_to_reindex.table2(col1 SERIAL PRIMARY KEY, col2 VARCHAR(100) NOT NULL);
-CREATE INDEX ON schema_to_reindex.table2(col2);
+SET search_path = 'schema_to_reindex';
+CREATE TABLE table1(col1 SERIAL PRIMARY KEY);
+INSERT INTO table1 SELECT generate_series(1,400);
+CREATE TABLE table2(col1 SERIAL PRIMARY KEY, col2 TEXT NOT NULL);
+INSERT INTO table2 SELECT generate_series(1,400), 'abc';
+CREATE INDEX ON table2(col2);
+CREATE MATERIALIZED VIEW matview AS SELECT col1 FROM table2;
+CREATE INDEX ON matview(col1);
+CREATE VIEW view AS SELECT col2 FROM table2;
+CREATE TABLE reindex_before AS
+SELECT oid, relname, relfilenode, relkind, reltoastrelid
+   FROM pg_class
+   where relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schema_to_reindex');
+INSERT INTO reindex_before
+SELECT oid, 'pg_toast_TABLE', relfilenode, relkind, reltoastrelid
+FROM pg_class WHERE oid IN
+   (SELECT reltoastrelid FROM reindex_before WHERE reltoastrelid > 0);
+INSERT INTO reindex_before
+SELECT oid, 'pg_toast_TABLE_index', relfilenode, relkind, reltoastrelid
+FROM pg_class where oid in
+   (select indexrelid from pg_index where indrelid in
+       (select reltoastrelid from reindex_before where reltoastrelid > 0));
+ REINDEX SCHEMA schema_to_reindex;
+CREATE TABLE reindex_after AS SELECT oid, relname, relfilenode, relkind
+   FROM pg_class
+   where relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schema_to_reindex');
+SELECT b.relname,
+       b.relkind,
+       CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged'
+       ELSE 'relfilenode has changed' END
+FROM reindex_before b JOIN pg_class a ON b.oid = a.oid;
+       relname        | relkind |           case           
+----------------------+---------+--------------------------
+ table1_col1_seq      | S       | relfilenode is unchanged
+ table1               | r       | relfilenode is unchanged
+ table1_pkey          | i       | relfilenode has changed
+ table2_col1_seq      | S       | relfilenode is unchanged
+ table2               | r       | relfilenode is unchanged
+ table2_pkey          | i       | relfilenode has changed
+ table2_col2_idx      | i       | relfilenode has changed
+ matview              | m       | relfilenode is unchanged
+ matview_col1_idx     | i       | relfilenode has changed
+ view                 | v       | relfilenode is unchanged
+ pg_toast_TABLE       | t       | relfilenode is unchanged
+ pg_toast_TABLE_index | i       | relfilenode has changed
+(12 rows)
+
 REINDEX SCHEMA schema_to_reindex;
 BEGIN;
 REINDEX SCHEMA schema_to_reindex; -- failure, cannot run in a transaction
 RESET ROLE;
 DROP ROLE regression_reindexuser;
 DROP SCHEMA schema_to_reindex CASCADE;
-NOTICE:  drop cascades to 2 other objects
-DETAIL:  drop cascades to table schema_to_reindex.table1
-drop cascades to table schema_to_reindex.table2
+NOTICE:  drop cascades to 6 other objects
+DETAIL:  drop cascades to table table1
+drop cascades to table table2
+drop cascades to materialized view matview
+drop cascades to view view
+drop cascades to table reindex_before
+drop cascades to table reindex_after
 
 --
 REINDEX SCHEMA schema_to_reindex; -- failure, schema does not exist
 CREATE SCHEMA schema_to_reindex;
-CREATE TABLE schema_to_reindex.table1(col1 SERIAL PRIMARY KEY);
-CREATE TABLE schema_to_reindex.table2(col1 SERIAL PRIMARY KEY, col2 VARCHAR(100) NOT NULL);
-CREATE INDEX ON schema_to_reindex.table2(col2);
+SET search_path = 'schema_to_reindex';
+CREATE TABLE table1(col1 SERIAL PRIMARY KEY);
+INSERT INTO table1 SELECT generate_series(1,400);
+CREATE TABLE table2(col1 SERIAL PRIMARY KEY, col2 TEXT NOT NULL);
+INSERT INTO table2 SELECT generate_series(1,400), 'abc';
+CREATE INDEX ON table2(col2);
+CREATE MATERIALIZED VIEW matview AS SELECT col1 FROM table2;
+CREATE INDEX ON matview(col1);
+CREATE VIEW view AS SELECT col2 FROM table2;
+CREATE TABLE reindex_before AS
+SELECT oid, relname, relfilenode, relkind, reltoastrelid
+   FROM pg_class
+   where relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schema_to_reindex');
+INSERT INTO reindex_before
+SELECT oid, 'pg_toast_TABLE', relfilenode, relkind, reltoastrelid
+FROM pg_class WHERE oid IN
+   (SELECT reltoastrelid FROM reindex_before WHERE reltoastrelid > 0);
+INSERT INTO reindex_before
+SELECT oid, 'pg_toast_TABLE_index', relfilenode, relkind, reltoastrelid
+FROM pg_class where oid in
+   (select indexrelid from pg_index where indrelid in
+       (select reltoastrelid from reindex_before where reltoastrelid > 0));
+ REINDEX SCHEMA schema_to_reindex;
+CREATE TABLE reindex_after AS SELECT oid, relname, relfilenode, relkind
+   FROM pg_class
+   where relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schema_to_reindex');
+SELECT b.relname,
+       b.relkind,
+       CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged'
+       ELSE 'relfilenode has changed' END
+FROM reindex_before b JOIN pg_class a ON b.oid = a.oid;
 REINDEX SCHEMA schema_to_reindex;
 BEGIN;
 REINDEX SCHEMA schema_to_reindex; -- failure, cannot run in a transaction