mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-28 11:55:03 +03:00 
			
		
		
		
	Defend against > INDEX_MAX_KEYS keys in an index.
This commit is contained in:
		| @@ -1,13 +1,13 @@ | |||||||
| /*------------------------------------------------------------------------- | /*------------------------------------------------------------------------- | ||||||
|  * |  * | ||||||
|  * defind.c |  * indexcmds.c | ||||||
|  *	  POSTGRES define, extend and remove index code. |  *	  POSTGRES define, extend and remove index code. | ||||||
|  * |  * | ||||||
|  * Copyright (c) 1994, Regents of the University of California |  * Copyright (c) 1994, Regents of the University of California | ||||||
|  * |  * | ||||||
|  * |  * | ||||||
|  * IDENTIFICATION |  * IDENTIFICATION | ||||||
|  *	  $Header: /cvsroot/pgsql/src/backend/commands/indexcmds.c,v 1.18 2000/01/11 03:33:11 momjian Exp $ |  *	  $Header: /cvsroot/pgsql/src/backend/commands/indexcmds.c,v 1.19 2000/01/12 05:04:42 tgl Exp $ | ||||||
|  * |  * | ||||||
|  *------------------------------------------------------------------------- |  *------------------------------------------------------------------------- | ||||||
|  */ |  */ | ||||||
| @@ -87,6 +87,9 @@ DefineIndex(char *heapRelationName, | |||||||
| 	numberOfAttributes = length(attributeList); | 	numberOfAttributes = length(attributeList); | ||||||
| 	if (numberOfAttributes <= 0) | 	if (numberOfAttributes <= 0) | ||||||
| 		elog(ERROR, "DefineIndex: must specify at least one attribute"); | 		elog(ERROR, "DefineIndex: must specify at least one attribute"); | ||||||
|  | 	if (numberOfAttributes > INDEX_MAX_KEYS) | ||||||
|  | 		elog(ERROR, "Cannot use more than %d attributes in an index", | ||||||
|  | 			 INDEX_MAX_KEYS); | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| 	 * compute heap relation id | 	 * compute heap relation id | ||||||
| @@ -152,10 +155,8 @@ DefineIndex(char *heapRelationName, | |||||||
|  |  | ||||||
| 		nargs = length(funcIndex->args); | 		nargs = length(funcIndex->args); | ||||||
| 		if (nargs > INDEX_MAX_KEYS) | 		if (nargs > INDEX_MAX_KEYS) | ||||||
| 		{ | 			elog(ERROR, "Index function can take at most %d arguments", | ||||||
| 			elog(ERROR, | 				 INDEX_MAX_KEYS); | ||||||
| 			   "Too many args to function, limit of %d", INDEX_MAX_KEYS); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		FIsetnArgs(&fInfo, nargs); | 		FIsetnArgs(&fInfo, nargs); | ||||||
|  |  | ||||||
| @@ -258,10 +259,12 @@ ExtendIndex(char *indexRelationName, Expr *predicate, List *rangetable) | |||||||
| 	relationId = index->indrelid; | 	relationId = index->indrelid; | ||||||
| 	indproc = index->indproc; | 	indproc = index->indproc; | ||||||
|  |  | ||||||
| 	for (i = INDEX_MAX_KEYS-1; i >= 0; i--) | 	for (i = 0; i < INDEX_MAX_KEYS; i++) | ||||||
|  | 	{ | ||||||
| 		if (index->indkey[i] == InvalidAttrNumber) | 		if (index->indkey[i] == InvalidAttrNumber) | ||||||
| 			break; | 			break; | ||||||
| 	numberOfAttributes = i+1; | 	} | ||||||
|  | 	numberOfAttributes = i; | ||||||
|  |  | ||||||
| 	if (VARSIZE(&index->indpred) != 0) | 	if (VARSIZE(&index->indpred) != 0) | ||||||
| 	{ | 	{ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user