Files
2024-10-25 04:00:51 -07:00

164 lines
5.0 KiB
C

/*---------------------------------------------------------------------------------------*
* gms_sql.h
*
* Definition about gms_sql package.
*
* IDENTIFICATION
* contrib/gms_sql/gms_sql.h
*
* ---------------------------------------------------------------------------------------
*/
#ifndef GMS_SQL_H
#define GMS_SQL_H
#include "catalog/pg_type.h"
#include "executor/spi.h"
#include "parser/parse_coerce.h"
#include "utils/memutils.h"
/*
* It is used for transformation result data to form
* generated by column_value procedure or column
* value function.
*/
typedef struct
{
bool isvalid; /* true, when this cast can be used */
bool without_cast; /* true, when cast is not necessary */
Oid targettypid; /* used for domains */
Oid array_targettypid; /* used for array domains */
int32 targettypmod; /* used for strings */
bool typbyval; /* used for copy result to outer memory context */
int16 typlen; /* used for copy result to outer memory context */
bool is_array;
Oid funcoid;
Oid funcoid_typmod;
CoercionPathType path;
CoercionPathType path_typmod;
FmgrInfo finfo;
FmgrInfo finfo_typmod;
FmgrInfo finfo_out;
FmgrInfo finfo_in;
Oid typIOParam;
} CastCacheData;
/*
* gms_sql cursor definition
*/
typedef struct
{
int16 cid;
char *parsed_query;
char *original_query;
unsigned int nvariables;
int max_colpos;
List *variables;
List *columns;
char cursorname[32];
Portal portal; /* one shot (execute) plan */
SPIPlanPtr plan;
MemoryContext cursor_cxt;
MemoryContext cursor_xact_cxt;
MemoryContext tuples_cxt;
MemoryContext result_cxt; /* short life memory context */
HeapTuple tuples[1000];
TupleDesc coltupdesc;
TupleDesc tupdesc;
CastCacheData *casts;
uint64 processed;
uint64 nread;
uint64 start_read;
bool assigned;
bool executed;
Bitmapset *array_columns; /* set of array columns */
uint64 batch_rows; /* how much rows should be fetched to fill target arrays */
} CursorData;
typedef struct GmssqlContext
{
MemoryContext gms_sql_cxt = NULL;
CursorData *gms_sql_cursors = NULL;
}GmssqlContext;
/*
* bind variable data
*/
typedef struct
{
char *refname;
int position;
Datum value;
Oid typoid;
bool typbyval;
int16 typlen;
bool isnull;
unsigned int varno; /* number of assigned placeholder of parsed query */
bool is_array; /* true, when a value is assigned via bind_array */
Oid typelemid; /* Oid of element of a array */
bool typelembyval;
int16 typelemlen;
int index1;
int index2;
} VariableData;
/*
* Query result column definition
*/
typedef struct
{
int position;
Oid typoid;
bool typbyval;
int16 typlen;
int32 typmod;
bool typisstr;
Oid typarrayoid; /* oid of requested array output value */
uint64 rowcount; /* maximal rows of requested array */
int index1; /* output array should be rewrited from this index */
} ColumnData;
typedef enum
{
TOKEN_SPACES,
TOKEN_COMMENT,
TOKEN_NUMBER,
TOKEN_BIND_VAR,
TOKEN_STR,
TOKEN_EXT_STR,
TOKEN_DOLAR_STR,
TOKEN_IDENTIF,
TOKEN_QIDENTIF,
TOKEN_DOUBLE_COLON,
TOKEN_OTHER,
TOKEN_NONE
} ofTokenType;
/* from gms_sql.cpp */
extern "C" Datum gms_sql_is_open(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_open_cursor(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_close_cursor(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_parse(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_bind_variable(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_bind_variable_f(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_bind_array_3(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_bind_array_5(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_define_column(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_define_array(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_execute(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_fetch_rows(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_execute_and_fetch(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_column_value(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_column_value_f(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_last_row_count(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_describe_columns(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_describe_columns_f(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_debug_cursor(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_return_result(PG_FUNCTION_ARGS);
extern "C" Datum gms_sql_return_result_i(PG_FUNCTION_ARGS);
#endif