Skip to content

Commit c4a46ac

Browse files
committed
Add hypertable cache lookup on ID/pkey
Hypertables can now be looked up through the cache on ID/pkey in addition to OID.
1 parent f38a578 commit c4a46ac

File tree

4 files changed

+49
-4
lines changed

4 files changed

+49
-4
lines changed

src/hypertable.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,47 @@ hypertable_from_tuple(HeapTuple tuple)
3232
return h;
3333
}
3434

35+
static bool
36+
hypertable_tuple_get_relid(TupleInfo *ti, void *data)
37+
{
38+
FormData_hypertable *form = (FormData_hypertable *) GETSTRUCT(ti->tuple);
39+
Oid *relid = data;
40+
Oid schema_oid = get_namespace_oid(NameStr(form->schema_name), true);
41+
42+
if (OidIsValid(schema_oid))
43+
*relid = get_relname_relid(NameStr(form->table_name), schema_oid);
44+
45+
return false;
46+
}
47+
48+
Oid
49+
hypertable_id_to_relid(int32 hypertable_id)
50+
{
51+
Catalog *catalog = catalog_get();
52+
Oid relid = InvalidOid;
53+
ScanKeyData scankey[1];
54+
ScannerCtx scanctx = {
55+
.table = catalog->tables[HYPERTABLE].id,
56+
.index = catalog->tables[HYPERTABLE].index_ids[HYPERTABLE_ID_INDEX],
57+
.scantype = ScannerTypeIndex,
58+
.nkeys = 1,
59+
.scankey = scankey,
60+
.tuple_found = hypertable_tuple_get_relid,
61+
.data = &relid,
62+
.lockmode = AccessShareLock,
63+
.scandirection = ForwardScanDirection,
64+
};
65+
66+
/* Perform an index scan on the hypertable pkey. */
67+
ScanKeyInit(&scankey[0], Anum_hypertable_pkey_idx_id,
68+
BTEqualStrategyNumber, F_INT4EQ,
69+
Int32GetDatum(hypertable_id));
70+
71+
scanner_scan(&scanctx);
72+
73+
return relid;
74+
}
75+
3576
typedef struct ChunkCacheEntry
3677
{
3778
MemoryContext mcxt;

src/hypertable.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ typedef struct Hypertable
2222
extern Hypertable *hypertable_from_tuple(HeapTuple tuple);
2323
extern int hypertable_set_name(Hypertable *ht, const char *newname);
2424
extern int hypertable_set_schema(Hypertable *ht, const char *newname);
25+
extern Oid hypertable_id_to_relid(int32 hypertable_id);
2526
extern Chunk *hypertable_get_chunk(Hypertable *h, Point *point);
2627
extern Oid hypertable_relid(RangeVar *rv);
2728
extern bool is_hypertable(Oid relid);

src/hypertable_cache.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ hypertable_cache_create()
6565
return cache;
6666
}
6767

68-
6968
static Cache *hypertable_cache_current = NULL;
7069

7170
static bool
@@ -83,7 +82,6 @@ hypertable_cache_create_entry(Cache *cache, CacheQuery *query)
8382
HypertableCacheQuery *hq = (HypertableCacheQuery *) query;
8483
Catalog *catalog = catalog_get();
8584
HypertableNameCacheEntry *cache_entry = query->result;
86-
Hypertable *ht;
8785
int number_found;
8886
ScanKeyData scankey[2];
8987
ScannerCtx scanCtx = {
@@ -123,8 +121,6 @@ hypertable_cache_create_entry(Cache *cache, CacheQuery *query)
123121
case 1:
124122
Assert(strncmp(cache_entry->hypertable->fd.schema_name.data, hq->schema, NAMEDATALEN) == 0);
125123
Assert(strncmp(cache_entry->hypertable->fd.table_name.data, hq->table, NAMEDATALEN) == 0);
126-
ht = cache_entry->hypertable;
127-
ht->space = dimension_scan(ht->fd.id, ht->main_table_relid, ht->fd.num_dimensions);
128124
break;
129125
default:
130126
elog(ERROR, "Got an unexpected number of records: %d", number_found);
@@ -158,6 +154,12 @@ hypertable_cache_get_entry_rv(Cache *cache, RangeVar *rv)
158154
return hypertable_cache_get_entry(cache, RangeVarGetRelid(rv, NoLock, true));
159155
}
160156

157+
Hypertable *
158+
hypertable_cache_get_entry_by_id(Cache *cache, int32 hypertable_id)
159+
{
160+
return hypertable_cache_get_entry(cache, hypertable_id_to_relid(hypertable_id));
161+
}
162+
161163
Hypertable *
162164
hypertable_cache_get_entry_with_table(Cache *cache, Oid relid, const char *schema, const char *table)
163165
{

src/hypertable_cache.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
extern Hypertable *hypertable_cache_get_entry(Cache *cache, Oid relid);
99
extern Hypertable *hypertable_cache_get_entry_rv(Cache *cache, RangeVar *rv);
1010
extern Hypertable *hypertable_cache_get_entry_with_table(Cache *cache, Oid relid, const char *schema, const char *table);
11+
extern Hypertable *hypertable_cache_get_entry_by_id(Cache *cache, int32 hypertable_id);
1112

1213
extern void hypertable_cache_invalidate_callback(void);
1314

0 commit comments

Comments
 (0)