124 pg_log_error(
"\\crosstabview: statement did not return a result set");
130 pg_log_error(
"\\crosstabview: query must return at least three columns");
157 pg_log_error(
"\\crosstabview: vertical and horizontal headers must be different columns");
173 pg_log_error(
"\\crosstabview: data column must be specified when query returns more than three columns");
229 pg_log_error(
"\\crosstabview: maximum number of columns (%d) exceeded",
398 pg_log_error(
"\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"",
399 rp->name ?
rp->name :
401 cp->name ?
cp->name :
416 for (
i = 0;
i <
cont.cellsadded;
i++)
441 tree->end->children[0] =
tree->end->children[1] =
tree->end;
460 if (node ==
tree->root)
463 if (node !=
tree->end)
513 int dir = (1 -
b) / 2;
519 if (current !=
tree->end)
533 if (current ==
tree->end)
579 if (node ==
tree->end)
646 pg_log_error(
"\\crosstabview: column number %d is out of range 1..%d",
Datum idx(PG_FUNCTION_ARGS)
#define Assert(condition)
static void avlUpdateHeight(avl_node *n)
static int avlCollectFields(avl_tree *tree, avl_node *node, pivot_field *fields, int idx)
static int pivotFieldCompare(const void *a, const void *b)
static void avlInsertNode(avl_tree *tree, avl_node **node, pivot_field field)
static int rankCompare(const void *a, const void *b)
struct _avl_tree avl_tree
static void avlFree(avl_tree *tree, avl_node *node)
static bool printCrosstab(const PGresult *result, int num_columns, pivot_field *piv_columns, int field_for_columns, int num_rows, pivot_field *piv_rows, int field_for_rows, int field_for_data)
static void rankSort(int num_columns, pivot_field *piv_columns)
bool PrintResultInCrosstab(const PGresult *res)
static int avlBalance(avl_node *n)
static int indexOfColumn(char *arg, const PGresult *res)
static avl_node * avlRotate(avl_node **current, int dir)
static void avlInit(avl_tree *tree)
static void avlMergeValue(avl_tree *tree, char *name, char *sort_value)
struct _avl_node avl_node
struct _pivot_field pivot_field
static void avlAdjustBalance(avl_tree *tree, avl_node **node)
#define CROSSTABVIEW_MAX_COLUMNS
Oid PQftype(const PGresult *res, int field_num)
void * pg_malloc(size_t size)
void * pg_malloc0(size_t size)
void printTableInit(printTableContent *const content, const printTableOpt *opt, const char *title, const int ncolumns, const int nrows)
void printTableCleanup(printTableContent *const content)
char column_type_alignment(Oid ftype)
void printTable(const printTableContent *cont, FILE *fout, bool is_pager, FILE *flog)
void printTableAddHeader(printTableContent *const content, char *header, const bool translate, const char align)
static int pg_cmp_s32(int32 a, int32 b)
#define pg_log_error(...)
#define qsort(a, b, c, d)
void dequote_downcase_identifier(char *str, bool downcase, int encoding)
static int cmp(const chr *x, const chr *y, size_t len)
static int before(chr x, chr y)
struct _avl_node * children[2]