1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * windowapi.h |
4 | * API for window functions to extract data from their window |
5 | * |
6 | * A window function does not receive its arguments in the normal way |
7 | * (and therefore the concept of strictness is irrelevant). Instead it |
8 | * receives a "WindowObject", which it can fetch with PG_WINDOW_OBJECT() |
9 | * (note V1 calling convention must be used). Correct call context can |
10 | * be tested with WindowObjectIsValid(). Although argument values are |
11 | * not passed, the call is correctly set up so that PG_NARGS() can be |
12 | * used and argument type information can be obtained with |
13 | * get_fn_expr_argtype(), get_fn_expr_arg_stable(), etc. |
14 | * |
15 | * Operations on the WindowObject allow the window function to find out |
16 | * the current row number, total number of rows in the partition, etc |
17 | * and to evaluate its argument expression(s) at various rows in the |
18 | * window partition. See the header comments for each WindowObject API |
19 | * function in nodeWindowAgg.c for details. |
20 | * |
21 | * |
22 | * Portions Copyright (c) 2000-2019, PostgreSQL Global Development Group |
23 | * |
24 | * src/include/windowapi.h |
25 | * |
26 | *------------------------------------------------------------------------- |
27 | */ |
28 | #ifndef WINDOWAPI_H |
29 | #define WINDOWAPI_H |
30 | |
31 | /* values of "seektype" */ |
32 | #define WINDOW_SEEK_CURRENT 0 |
33 | #define WINDOW_SEEK_HEAD 1 |
34 | #define WINDOW_SEEK_TAIL 2 |
35 | |
36 | /* this struct is private in nodeWindowAgg.c */ |
37 | typedef struct WindowObjectData *WindowObject; |
38 | |
39 | #define PG_WINDOW_OBJECT() ((WindowObject) fcinfo->context) |
40 | |
41 | #define WindowObjectIsValid(winobj) \ |
42 | ((winobj) != NULL && IsA(winobj, WindowObjectData)) |
43 | |
44 | extern void *WinGetPartitionLocalMemory(WindowObject winobj, Size sz); |
45 | |
46 | extern int64 WinGetCurrentPosition(WindowObject winobj); |
47 | extern int64 WinGetPartitionRowCount(WindowObject winobj); |
48 | |
49 | extern void WinSetMarkPosition(WindowObject winobj, int64 markpos); |
50 | |
51 | extern bool WinRowsArePeers(WindowObject winobj, int64 pos1, int64 pos2); |
52 | |
53 | extern Datum WinGetFuncArgInPartition(WindowObject winobj, int argno, |
54 | int relpos, int seektype, bool set_mark, |
55 | bool *isnull, bool *isout); |
56 | |
57 | extern Datum WinGetFuncArgInFrame(WindowObject winobj, int argno, |
58 | int relpos, int seektype, bool set_mark, |
59 | bool *isnull, bool *isout); |
60 | |
61 | extern Datum WinGetFuncArgCurrent(WindowObject winobj, int argno, |
62 | bool *isnull); |
63 | |
64 | #endif /* WINDOWAPI_H */ |
65 | |