diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c index 0c03f5e812f..469ff82db39 100644 --- a/src/backend/optimizer/path/pathkeys.c +++ b/src/backend/optimizer/path/pathkeys.c @@ -11,7 +11,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/pathkeys.c,v 1.96 2009/01/01 17:23:44 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/pathkeys.c,v 1.97 2009/02/28 03:51:05 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -332,6 +332,14 @@ compare_pathkeys(List *keys1, List *keys2) ListCell *key1, *key2; + /* + * Fall out quickly if we are passed two identical lists. This mostly + * catches the case where both are NIL, but that's common enough to + * warrant the test. + */ + if (keys1 == keys2) + return PATHKEYS_EQUAL; + forboth(key1, keys1, key2, keys2) { PathKey *pathkey1 = (PathKey *) lfirst(key1); @@ -354,11 +362,11 @@ compare_pathkeys(List *keys1, List *keys2) * If we reached the end of only one list, the other is longer and * therefore not a subset. */ - if (key1 == NULL && key2 == NULL) - return PATHKEYS_EQUAL; if (key1 != NULL) return PATHKEYS_BETTER1; /* key1 is longer */ - return PATHKEYS_BETTER2; /* key2 is longer */ + if (key2 != NULL) + return PATHKEYS_BETTER2; /* key2 is longer */ + return PATHKEYS_EQUAL; } /*