/*
         * and columns match through the attribute map (actual attribute numbers
-        * might differ!)  Note that this implies that index columns that are
+        * might differ!)  Note that this checks that index columns that are
         * expressions appear in the same positions.  We will next compare the
         * expressions themselves.
         */
                if (attmap->maplen < info2->ii_IndexAttrNumbers[i])
                        elog(ERROR, "incorrect attribute map");
 
-               /* ignore expressions at this stage */
-               if ((info1->ii_IndexAttrNumbers[i] != InvalidAttrNumber) &&
-                       (attmap->attnums[info2->ii_IndexAttrNumbers[i] - 1] !=
-                        info1->ii_IndexAttrNumbers[i]))
-                       return false;
+               /* ignore expressions for now (but check their collation/opfamily) */
+               if (!(info1->ii_IndexAttrNumbers[i] == InvalidAttrNumber &&
+                         info2->ii_IndexAttrNumbers[i] == InvalidAttrNumber))
+               {
+                       /* fail if just one index has an expression in this column */
+                       if (info1->ii_IndexAttrNumbers[i] == InvalidAttrNumber ||
+                               info2->ii_IndexAttrNumbers[i] == InvalidAttrNumber)
+                               return false;
+
+                       /* both are columns, so check for match after mapping */
+                       if (attmap->attnums[info2->ii_IndexAttrNumbers[i] - 1] !=
+                               info1->ii_IndexAttrNumbers[i])
+                               return false;
+               }
 
-               /* collation and opfamily is not valid for including columns */
+               /* collation and opfamily are not valid for included columns */
                if (i >= info1->ii_NumIndexKeyAttrs)
                        continue;