mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
CREATE INDEX ... INCLUDING (column[, ...])
Now indexes (but only B-tree for now) can contain "extra" column(s) which doesn't participate in index structure, they are just stored in leaf tuples. It allows to use index only scan by using single index instead of two or more indexes. Author: Anastasia Lubennikova with minor editorializing by me Reviewers: David Rowley, Peter Geoghegan, Jeff Janes
This commit is contained in:
@ -100,7 +100,7 @@ static remoteConn *getConnectionByName(const char *name);
|
||||
static HTAB *createConnHash(void);
|
||||
static void createNewConnection(const char *name, remoteConn *rconn);
|
||||
static void deleteConnection(const char *name);
|
||||
static char **get_pkey_attnames(Relation rel, int16 *numatts);
|
||||
static char **get_pkey_attnames(Relation rel, int16 *indnkeyatts);
|
||||
static char **get_text_array_contents(ArrayType *array, int *numitems);
|
||||
static char *get_sql_insert(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals, char **tgt_pkattvals);
|
||||
static char *get_sql_delete(Relation rel, int *pkattnums, int pknumatts, char **tgt_pkattvals);
|
||||
@ -1485,7 +1485,7 @@ PG_FUNCTION_INFO_V1(dblink_get_pkey);
|
||||
Datum
|
||||
dblink_get_pkey(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int16 numatts;
|
||||
int16 indnkeyatts;
|
||||
char **results;
|
||||
FuncCallContext *funcctx;
|
||||
int32 call_cntr;
|
||||
@ -1511,7 +1511,7 @@ dblink_get_pkey(PG_FUNCTION_ARGS)
|
||||
rel = get_rel_from_relname(PG_GETARG_TEXT_P(0), AccessShareLock, ACL_SELECT);
|
||||
|
||||
/* get the array of attnums */
|
||||
results = get_pkey_attnames(rel, &numatts);
|
||||
results = get_pkey_attnames(rel, &indnkeyatts);
|
||||
|
||||
relation_close(rel, AccessShareLock);
|
||||
|
||||
@ -1531,9 +1531,9 @@ dblink_get_pkey(PG_FUNCTION_ARGS)
|
||||
attinmeta = TupleDescGetAttInMetadata(tupdesc);
|
||||
funcctx->attinmeta = attinmeta;
|
||||
|
||||
if ((results != NULL) && (numatts > 0))
|
||||
if ((results != NULL) && (indnkeyatts > 0))
|
||||
{
|
||||
funcctx->max_calls = numatts;
|
||||
funcctx->max_calls = indnkeyatts;
|
||||
|
||||
/* got results, keep track of them */
|
||||
funcctx->user_fctx = results;
|
||||
@ -2023,10 +2023,10 @@ dblink_fdw_validator(PG_FUNCTION_ARGS)
|
||||
* get_pkey_attnames
|
||||
*
|
||||
* Get the primary key attnames for the given relation.
|
||||
* Return NULL, and set numatts = 0, if no primary key exists.
|
||||
* Return NULL, and set indnkeyatts = 0, if no primary key exists.
|
||||
*/
|
||||
static char **
|
||||
get_pkey_attnames(Relation rel, int16 *numatts)
|
||||
get_pkey_attnames(Relation rel, int16 *indnkeyatts)
|
||||
{
|
||||
Relation indexRelation;
|
||||
ScanKeyData skey;
|
||||
@ -2036,8 +2036,8 @@ get_pkey_attnames(Relation rel, int16 *numatts)
|
||||
char **result = NULL;
|
||||
TupleDesc tupdesc;
|
||||
|
||||
/* initialize numatts to 0 in case no primary key exists */
|
||||
*numatts = 0;
|
||||
/* initialize indnkeyatts to 0 in case no primary key exists */
|
||||
*indnkeyatts = 0;
|
||||
|
||||
tupdesc = rel->rd_att;
|
||||
|
||||
@ -2058,12 +2058,12 @@ get_pkey_attnames(Relation rel, int16 *numatts)
|
||||
/* we're only interested if it is the primary key */
|
||||
if (index->indisprimary)
|
||||
{
|
||||
*numatts = index->indnatts;
|
||||
if (*numatts > 0)
|
||||
*indnkeyatts = index->indnkeyatts;
|
||||
if (*indnkeyatts > 0)
|
||||
{
|
||||
result = (char **) palloc(*numatts * sizeof(char *));
|
||||
result = (char **) palloc(*indnkeyatts * sizeof(char *));
|
||||
|
||||
for (i = 0; i < *numatts; i++)
|
||||
for (i = 0; i < *indnkeyatts; i++)
|
||||
result[i] = SPI_fname(tupdesc, index->indkey.values[i]);
|
||||
}
|
||||
break;
|
||||
|
@ -138,9 +138,9 @@ triggered_change_notification(PG_FUNCTION_ARGS)
|
||||
/* we're only interested if it is the primary key and valid */
|
||||
if (index->indisprimary && IndexIsValid(index))
|
||||
{
|
||||
int numatts = index->indnatts;
|
||||
int indnkeyatts = index->indnkeyatts;
|
||||
|
||||
if (numatts > 0)
|
||||
if (indnkeyatts > 0)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -150,7 +150,7 @@ triggered_change_notification(PG_FUNCTION_ARGS)
|
||||
appendStringInfoCharMacro(payload, ',');
|
||||
appendStringInfoCharMacro(payload, operation);
|
||||
|
||||
for (i = 0; i < numatts; i++)
|
||||
for (i = 0; i < indnkeyatts; i++)
|
||||
{
|
||||
int colno = index->indkey.values[i];
|
||||
|
||||
|
Reference in New Issue
Block a user