#ifndef PG_QUERY_H
#define PG_QUERY_H
#include <stdbool.h>
#include <stdint.h>
#include <sys/types.h>
#include "postgres_deparse.h"
typedef struct {
char* message; char* funcname; char* filename; int lineno; int cursorpos; char* context; } PgQueryError;
typedef struct {
int length;
bool *items;
PgQueryError* error;
} PgQueryIsUtilityResult;
typedef struct {
size_t len;
char* data;
} PgQueryProtobuf;
typedef struct {
int32_t start;
int32_t end;
int32_t token;
int32_t keyword_kind;
} PgQueryScanToken;
typedef struct {
PgQueryProtobuf pbuf;
PgQueryScanToken* tokens;
size_t token_count;
char* stderr_buffer;
PgQueryError* error;
} PgQueryScanResult;
typedef struct {
char* parse_tree;
char* stderr_buffer;
PgQueryError* error;
} PgQueryParseResult;
typedef struct {
PgQueryProtobuf parse_tree;
char* stderr_buffer;
PgQueryError* error;
} PgQueryProtobufParseResult;
typedef struct {
int stmt_location;
int stmt_len;
} PgQuerySplitStmt;
typedef struct {
PgQuerySplitStmt **stmts;
int n_stmts;
char* stderr_buffer;
PgQueryError* error;
} PgQuerySplitResult;
typedef struct {
char* query;
PgQueryError* error;
} PgQueryDeparseResult;
typedef struct {
PostgresDeparseComment **comments;
size_t comment_count;
PgQueryError* error;
} PgQueryDeparseCommentsResult;
typedef struct {
char* plpgsql_funcs;
PgQueryError* error;
} PgQueryPlpgsqlParseResult;
typedef enum {
PG_QUERY_CATALOG_LOOKUP_ERROR = -1,
PG_QUERY_CATALOG_LOOKUP_NOT_FOUND = 0,
PG_QUERY_CATALOG_LOOKUP_FOUND = 1
} PgQueryCatalogLookupResult;
typedef struct {
uint32_t oid;
uint32_t namespace_oid;
const char* name;
int16_t length;
bool by_value;
char type_kind;
char category;
char alignment;
char storage;
uint32_t array_oid;
uint32_t element_oid;
uint32_t base_type_oid;
uint32_t collation_oid;
uint32_t subscript_handler_oid;
} PgQueryPlpgsqlTypeMetadata;
typedef PgQueryCatalogLookupResult (*PgQueryPlpgsqlLookupNamespace)(
void* context, const char* schema_name, uint32_t* namespace_oid);
typedef PgQueryCatalogLookupResult (*PgQueryPlpgsqlLookupTypeByName)(
void* context, const char* schema_name, const char* type_name,
PgQueryPlpgsqlTypeMetadata* type);
typedef PgQueryCatalogLookupResult (*PgQueryPlpgsqlLookupTypeByOid)(
void* context, uint32_t type_oid, PgQueryPlpgsqlTypeMetadata* type);
typedef const char* (*PgQueryPlpgsqlCatalogError)(void* context);
typedef struct {
void* context;
PgQueryPlpgsqlLookupNamespace lookup_namespace;
PgQueryPlpgsqlLookupTypeByName lookup_type_by_name;
PgQueryPlpgsqlLookupTypeByOid lookup_type_by_oid;
PgQueryPlpgsqlCatalogError get_error;
} PgQueryPlpgsqlCatalog;
typedef struct {
uint64_t fingerprint;
char* fingerprint_str;
char* stderr_buffer;
PgQueryError* error;
} PgQueryFingerprintResult;
typedef struct {
char* normalized_query;
PgQueryError* error;
} PgQueryNormalizeResult;
typedef struct {
PgQueryProtobuf summary;
char* stderr_buffer;
PgQueryError* error;
} PgQuerySummaryParseResult;
typedef enum
{
PG_QUERY_PARSE_DEFAULT = 0,
PG_QUERY_PARSE_TYPE_NAME,
PG_QUERY_PARSE_PLPGSQL_EXPR,
PG_QUERY_PARSE_PLPGSQL_ASSIGN1,
PG_QUERY_PARSE_PLPGSQL_ASSIGN2,
PG_QUERY_PARSE_PLPGSQL_ASSIGN3
} PgQueryParseMode;
#define PG_QUERY_PARSE_MODE_BITS 4
#define PG_QUERY_PARSE_MODE_BITMASK ((1 << PG_QUERY_PARSE_MODE_BITS) - 1)
#define PG_QUERY_DISABLE_BACKSLASH_QUOTE 16
#define PG_QUERY_DISABLE_STANDARD_CONFORMING_STRINGS 32
#define PG_QUERY_DISABLE_ESCAPE_STRING_WARNING 64
#ifdef __cplusplus
extern "C" {
#endif
PgQueryNormalizeResult pg_query_normalize(const char* input);
PgQueryNormalizeResult pg_query_normalize_utility(const char* input);
PgQueryScanResult pg_query_scan(const char* input);
PgQueryParseResult pg_query_parse(const char* input);
PgQueryParseResult pg_query_parse_opts(const char* input, int parser_options);
PgQueryProtobufParseResult pg_query_parse_protobuf(const char* input);
PgQueryProtobufParseResult pg_query_parse_protobuf_opts(const char* input, int parser_options);
PgQueryPlpgsqlParseResult pg_query_parse_plpgsql(const char* input);
PgQueryPlpgsqlParseResult pg_query_parse_plpgsql_with_catalog(
const char* input, const PgQueryPlpgsqlCatalog* catalog);
PgQueryFingerprintResult pg_query_fingerprint(const char* input);
PgQueryFingerprintResult pg_query_fingerprint_opts(const char* input, int parser_options);
PgQuerySplitResult pg_query_split_with_scanner(const char *input);
PgQuerySplitResult pg_query_split_with_parser(const char *input);
PgQueryDeparseResult pg_query_deparse_protobuf(PgQueryProtobuf parse_tree);
PgQueryDeparseResult pg_query_deparse_protobuf_opts(PgQueryProtobuf parse_tree, struct PostgresDeparseOpts opts);
PgQueryDeparseCommentsResult pg_query_deparse_comments_for_query(const char *query);
PgQueryIsUtilityResult pg_query_is_utility_stmt(const char *query);
PgQuerySummaryParseResult pg_query_summary(const char* input, int parser_options, int truncate_limit);
void pg_query_free_normalize_result(PgQueryNormalizeResult result);
void pg_query_free_scan_result(PgQueryScanResult result);
void pg_query_free_parse_result(PgQueryParseResult result);
void pg_query_free_split_result(PgQuerySplitResult result);
void pg_query_free_deparse_result(PgQueryDeparseResult result);
void pg_query_free_deparse_comments_result(PgQueryDeparseCommentsResult result);
void pg_query_free_protobuf_parse_result(PgQueryProtobufParseResult result);
void pg_query_free_plpgsql_parse_result(PgQueryPlpgsqlParseResult result);
void pg_query_free_fingerprint_result(PgQueryFingerprintResult result);
void pg_query_free_is_utility_result(PgQueryIsUtilityResult result);
void pg_query_free_summary_parse_result(PgQuerySummaryParseResult result);
void pg_query_exit(void);
#define PG_MAJORVERSION "18"
#define PG_VERSION "18.4"
#define PG_VERSION_NUM 180004
void pg_query_init(void);
#ifdef __cplusplus
}
#endif
#endif