mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-17 11:03:36 +08:00
Export is_decompress_chunk_path / is_gapfill_path
This patch adds the 'ts_' prefix to the function names of is_decompress_chunk_path and is_gapfill_path and makes them available for use by other parts of TimescaleDB.
This commit is contained in:
parent
fa04a067e0
commit
08231c8aac
@ -10,6 +10,19 @@
|
|||||||
#include "cross_module_fn.h"
|
#include "cross_module_fn.h"
|
||||||
#include "compat/compat.h"
|
#include "compat/compat.h"
|
||||||
#include "export.h"
|
#include "export.h"
|
||||||
|
#include "gapfill.h"
|
||||||
|
|
||||||
|
bool
|
||||||
|
ts_is_gapfill_path(Path *path)
|
||||||
|
{
|
||||||
|
if (IsA(path, CustomPath))
|
||||||
|
{
|
||||||
|
CustomPath *cpath = castNode(CustomPath, path);
|
||||||
|
if (strcmp(cpath->methods->CustomName, GAPFILL_PATH_NAME) == 0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* stub function to trigger locf and interpolate in gapfill node
|
* stub function to trigger locf and interpolate in gapfill node
|
||||||
|
13
src/gapfill.h
Normal file
13
src/gapfill.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/*
|
||||||
|
* This file and its contents are licensed under the Apache License 2.0.
|
||||||
|
* Please see the included NOTICE for copyright information and
|
||||||
|
* LICENSE-APACHE for a copy of the license.
|
||||||
|
*/
|
||||||
|
#ifndef TIMESCALEDB_GAPFILL_H
|
||||||
|
#define TIMESCALEDB_GAPFILL_H
|
||||||
|
|
||||||
|
#define GAPFILL_PATH_NAME "GapFill"
|
||||||
|
|
||||||
|
extern bool ts_is_gapfill_path(Path *path);
|
||||||
|
|
||||||
|
#endif
|
@ -68,6 +68,27 @@ create_group_subpath(PlannerInfo *root, RelOptInfo *rel, List *group, List *path
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ChunkAppendPath *
|
||||||
|
ts_chunk_append_path_copy(ChunkAppendPath *ca, List *subpaths)
|
||||||
|
{
|
||||||
|
ListCell *lc;
|
||||||
|
double total_cost = 0, rows = 0;
|
||||||
|
ChunkAppendPath *new = palloc(sizeof(ChunkAppendPath));
|
||||||
|
memcpy(new, ca, sizeof(ChunkAppendPath));
|
||||||
|
new->cpath.custom_paths = subpaths;
|
||||||
|
|
||||||
|
foreach (lc, subpaths)
|
||||||
|
{
|
||||||
|
Path *child = lfirst(lc);
|
||||||
|
total_cost += child->total_cost;
|
||||||
|
rows += child->rows;
|
||||||
|
}
|
||||||
|
new->cpath.path.total_cost = total_cost;
|
||||||
|
new->cpath.path.rows = rows;
|
||||||
|
|
||||||
|
return new;
|
||||||
|
}
|
||||||
|
|
||||||
Path *
|
Path *
|
||||||
ts_chunk_append_path_create(PlannerInfo *root, RelOptInfo *rel, Hypertable *ht, Path *subpath,
|
ts_chunk_append_path_create(PlannerInfo *root, RelOptInfo *rel, Hypertable *ht, Path *subpath,
|
||||||
bool parallel_aware, bool ordered, List *nested_oids)
|
bool parallel_aware, bool ordered, List *nested_oids)
|
||||||
|
@ -22,6 +22,7 @@ typedef struct ChunkAppendPath
|
|||||||
int first_partial_path;
|
int first_partial_path;
|
||||||
} ChunkAppendPath;
|
} ChunkAppendPath;
|
||||||
|
|
||||||
|
extern TSDLLEXPORT ChunkAppendPath *ts_chunk_append_path_copy(ChunkAppendPath *ca, List *subpaths);
|
||||||
extern Path *ts_chunk_append_path_create(PlannerInfo *root, RelOptInfo *rel, Hypertable *ht,
|
extern Path *ts_chunk_append_path_create(PlannerInfo *root, RelOptInfo *rel, Hypertable *ht,
|
||||||
Path *subpath, bool parallel_aware, bool ordered,
|
Path *subpath, bool parallel_aware, bool ordered,
|
||||||
List *nested_oids);
|
List *nested_oids);
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "planner.h"
|
#include "planner.h"
|
||||||
#include "import/planner.h"
|
#include "import/planner.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
#include "gapfill.h"
|
||||||
#include "guc.h"
|
#include "guc.h"
|
||||||
#include "estimate.h"
|
#include "estimate.h"
|
||||||
|
|
||||||
@ -38,19 +39,6 @@
|
|||||||
* optimization fixes the statistics and adds the HashAggregate plan if appropriate.
|
* optimization fixes the statistics and adds the HashAggregate plan if appropriate.
|
||||||
* */
|
* */
|
||||||
|
|
||||||
#define GAPFILL_PATH_NAME "GapFill"
|
|
||||||
static bool
|
|
||||||
is_gapfill_path(Path *path)
|
|
||||||
{
|
|
||||||
if (IsA(path, CustomPath))
|
|
||||||
{
|
|
||||||
CustomPath *cpath = castNode(CustomPath, path);
|
|
||||||
if (strcmp(cpath->methods->CustomName, GAPFILL_PATH_NAME) == 0)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add a parallel HashAggregate plan.
|
/* Add a parallel HashAggregate plan.
|
||||||
* This code is similar to parts of create_grouping_paths */
|
* This code is similar to parts of create_grouping_paths */
|
||||||
static void
|
static void
|
||||||
@ -163,7 +151,7 @@ ts_plan_add_hashagg(PlannerInfo *root, RelOptInfo *input_rel, RelOptInfo *output
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* Don't add HashAgg path if this is a gapfill query */
|
/* Don't add HashAgg path if this is a gapfill query */
|
||||||
if (is_gapfill_path(linitial(output_rel->pathlist)))
|
if (ts_is_gapfill_path(linitial(output_rel->pathlist)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
MemSet(&agg_costs, 0, sizeof(AggClauseCosts));
|
MemSet(&agg_costs, 0, sizeof(AggClauseCosts));
|
||||||
|
@ -56,7 +56,6 @@ static OpExpr *fix_indexqual(IndexOptInfo *index, RestrictInfo *rinfo, AttrNumbe
|
|||||||
static bool build_skip_qual(PlannerInfo *root, SkipScanPath *skip_scan_path, IndexPath *index_path,
|
static bool build_skip_qual(PlannerInfo *root, SkipScanPath *skip_scan_path, IndexPath *index_path,
|
||||||
Var *var);
|
Var *var);
|
||||||
static List *build_subpath(PlannerInfo *root, List *subpaths, double ndistinct);
|
static List *build_subpath(PlannerInfo *root, List *subpaths, double ndistinct);
|
||||||
static ChunkAppendPath *copy_chunk_append_path(ChunkAppendPath *ca, List *subpaths);
|
|
||||||
static Var *get_distinct_var(PlannerInfo *root, IndexPath *index_path,
|
static Var *get_distinct_var(PlannerInfo *root, IndexPath *index_path,
|
||||||
SkipScanPath *skip_scan_path);
|
SkipScanPath *skip_scan_path);
|
||||||
static TargetEntry *tlist_member_match_var(Var *var, List *targetlist);
|
static TargetEntry *tlist_member_match_var(Var *var, List *targetlist);
|
||||||
@ -293,7 +292,7 @@ tsl_skip_scan_paths_add(PlannerInfo *root, RelOptInfo *input_rel, RelOptInfo *ou
|
|||||||
* information used for creating the original one and we don't want to
|
* information used for creating the original one and we don't want to
|
||||||
* duplicate all the checks done when creating the original one.
|
* duplicate all the checks done when creating the original one.
|
||||||
*/
|
*/
|
||||||
subpath = (Path *) copy_chunk_append_path(ca, new_paths);
|
subpath = (Path *) ts_chunk_append_path_copy(ca, new_paths);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -318,27 +317,6 @@ tsl_skip_scan_paths_add(PlannerInfo *root, RelOptInfo *input_rel, RelOptInfo *ou
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static ChunkAppendPath *
|
|
||||||
copy_chunk_append_path(ChunkAppendPath *ca, List *subpaths)
|
|
||||||
{
|
|
||||||
ListCell *lc;
|
|
||||||
double total_cost = 0, rows = 0;
|
|
||||||
ChunkAppendPath *new = palloc(sizeof(ChunkAppendPath));
|
|
||||||
memcpy(new, ca, sizeof(ChunkAppendPath));
|
|
||||||
new->cpath.custom_paths = subpaths;
|
|
||||||
|
|
||||||
foreach (lc, subpaths)
|
|
||||||
{
|
|
||||||
Path *child = lfirst(lc);
|
|
||||||
total_cost += child->total_cost;
|
|
||||||
rows += child->rows;
|
|
||||||
}
|
|
||||||
new->cpath.path.total_cost = total_cost;
|
|
||||||
new->cpath.path.rows = rows;
|
|
||||||
|
|
||||||
return new;
|
|
||||||
}
|
|
||||||
|
|
||||||
static SkipScanPath *
|
static SkipScanPath *
|
||||||
skip_scan_path_create(PlannerInfo *root, IndexPath *index_path, double ndistinct)
|
skip_scan_path_create(PlannerInfo *root, IndexPath *index_path, double ndistinct)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user