aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1999-05-03 19:10:48 +0000
committerBruce Momjian <bruce@momjian.us>1999-05-03 19:10:48 +0000
commit210055ad614ae845686fdf9f8fc6b60301689cc8 (patch)
tree0410cff48a92bc3c95aea12877046d4ab25aaedb /src/backend
parentda5f1dd7227bd507cc8d5b088fd3f5e53e932722 (diff)
downloadpostgresql-210055ad614ae845686fdf9f8fc6b60301689cc8.tar.gz
postgresql-210055ad614ae845686fdf9f8fc6b60301689cc8.zip
here are some patches for 6.5.0 which I already submitted but have never
been applied. The patches are in the .tar.gz attachment at the end: varchar-array.patch this patch adds support for arrays of bpchar() and varchar(), which where always missing from postgres. These datatypes can be used to replace the _char4, _char8, etc., which were dropped some time ago. block-size.patch this patch fixes many errors in the parser and other program which happen with very large query statements (> 8K) when using a page size larger than 8192. This patch is needed if you want to submit queries larger than 8K. Postgres supports tuples up to 32K but you can't insert them because you can't submit queries larger than 8K. My patch fixes this problem. The patch also replaces all the occurrences of `8192' and `1<<13' in the sources with the proper constants defined in include files. You should now never find 8192 hardwired in C code, just to make code clearer. -- Massimo Dal Zotto
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/commands/copy.c4
-rw-r--r--src/backend/libpq/be-fsstubs.c12
-rw-r--r--src/backend/parser/Makefile6
-rw-r--r--src/backend/parser/gram.y8
-rw-r--r--src/backend/parser/scan.l7
-rw-r--r--src/backend/port/hpux/fixade.h6
-rw-r--r--src/backend/tcop/postgres.c8
-rw-r--r--src/backend/utils/adt/arrayfuncs.c156
-rw-r--r--src/backend/utils/adt/ruleutils.c27
-rw-r--r--src/backend/utils/adt/varchar.c24
10 files changed, 219 insertions, 39 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 4efa13635aa..dd280918165 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -6,7 +6,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.74 1999/04/25 03:19:09 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.75 1999/05/03 19:09:38 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1061,7 +1061,7 @@ GetIndexRelations(Oid main_relation_oid,
}
}
-#define EXT_ATTLEN 5*8192
+#define EXT_ATTLEN 5*BLCKSZ
/*
returns 1 is c is in s
diff --git a/src/backend/libpq/be-fsstubs.c b/src/backend/libpq/be-fsstubs.c
index 66320cd54d2..46c75f932e5 100644
--- a/src/backend/libpq/be-fsstubs.c
+++ b/src/backend/libpq/be-fsstubs.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/libpq/be-fsstubs.c,v 1.28 1999/02/13 23:15:41 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/libpq/be-fsstubs.c,v 1.29 1999/05/03 19:09:39 momjian Exp $
*
* NOTES
* This should be moved to a more appropriate place. It is here
@@ -44,7 +44,9 @@
/* [PA] is Pascal André <andre@via.ecp.fr> */
/*#define FSDB 1*/
-#define MAX_LOBJ_FDS 256
+#define MAX_LOBJ_FDS 256
+#define BUFSIZE 1024
+#define FNAME_BUFSIZE 8192
static LargeObjectDesc *cookies[MAX_LOBJ_FDS];
@@ -257,9 +259,8 @@ lo_import(text *filename)
int nbytes,
tmp;
-#define BUFSIZE 1024
char buf[BUFSIZE];
- char fnamebuf[8192];
+ char fnamebuf[FNAME_BUFSIZE];
LargeObjectDesc *lobj;
Oid lobjOid;
@@ -324,9 +325,8 @@ lo_export(Oid lobjId, text *filename)
int nbytes,
tmp;
-#define BUFSIZE 1024
char buf[BUFSIZE];
- char fnamebuf[8192];
+ char fnamebuf[FNAME_BUFSIZE];
LargeObjectDesc *lobj;
mode_t oumask;
diff --git a/src/backend/parser/Makefile b/src/backend/parser/Makefile
index 8fb817c91ff..b9e955e8523 100644
--- a/src/backend/parser/Makefile
+++ b/src/backend/parser/Makefile
@@ -4,7 +4,7 @@
# Makefile for parser
#
# IDENTIFICATION
-# $Header: /cvsroot/pgsql/src/backend/parser/Makefile,v 1.19 1998/07/26 04:30:30 scrappy Exp $
+# $Header: /cvsroot/pgsql/src/backend/parser/Makefile,v 1.20 1999/05/03 19:09:40 momjian Exp $
#
#-------------------------------------------------------------------------
@@ -37,7 +37,9 @@ gram.c parse.h: gram.y
scan.c: scan.l
$(LEX) $<
- mv lex.yy.c scan.c
+ sed -e 's/#define YY_BUF_SIZE .*/#define YY_BUF_SIZE 65536/' \
+ <lex.yy.c >scan.c
+ rm -f lex.yy.c
# The following dependencies on parse.h are computed by
# make depend, but we state them here explicitly anyway because
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 86f737179a3..b3836e0191d 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.71 1999/04/27 13:33:43 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.72 1999/05/03 19:09:41 momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -3290,7 +3290,6 @@ Typename: Array opt_array_bounds
else
$$->setof = FALSE;
}
- | Character
| SETOF Array
{
$$ = $2;
@@ -3301,6 +3300,7 @@ Typename: Array opt_array_bounds
Array: Generic
| Datetime
| Numeric
+ | Character
;
Generic: generic
@@ -3425,10 +3425,6 @@ opt_decimal: '(' Iconst ',' Iconst ')'
/* SQL92 character data types
* The following implements CHAR() and VARCHAR().
- * We do it here instead of the 'Generic' production
- * because we don't want to allow arrays of VARCHAR().
- * I haven't thought about whether that will work or not.
- * - ay 6/95
*/
Character: character '(' Iconst ')'
{
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index f87a124f092..d50ee9c62d8 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.47 1999/03/17 20:17:13 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.48 1999/05/03 19:09:42 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -32,6 +32,11 @@
#include "parse.h"
#include "utils/builtins.h"
+#ifdef YY_READ_BUF_SIZE
+#undef YY_READ_BUF_SIZE
+#endif
+#define YY_READ_BUF_SIZE MAX_PARSE_BUFFER
+
extern char *parseString;
static char *parseCh;
diff --git a/src/backend/port/hpux/fixade.h b/src/backend/port/hpux/fixade.h
index 8a96ad7cf29..d76c8c256e0 100644
--- a/src/backend/port/hpux/fixade.h
+++ b/src/backend/port/hpux/fixade.h
@@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: fixade.h,v 1.5 1999/02/13 23:17:33 momjian Exp $
+ * $Id: fixade.h,v 1.6 1999/05/03 19:09:44 momjian Exp $
*
* NOTES
* This must be included in EVERY source file.
@@ -47,11 +47,11 @@
*/
struct HP_WAY_BOGUS
{
- char hpwb_bogus[8192];
+ char hpwb_bogus[8191+1];
};
struct HP_TOO_BOGUS
{
- int hptb_bogus[8192];
+ int hptb_bogus[8191+1];
};
#endif /* BROKEN_STRUCT_INIT */
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 7e596fcc480..f196e51eaf0 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.109 1999/05/01 17:16:25 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.110 1999/05/03 19:09:54 momjian Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -452,14 +452,14 @@ pg_parse_and_plan(char *query_string, /* string to execute */
else
{
/* Print condensed query string to fit in one log line */
- char buff[8192 + 1];
+ char buff[MAX_QUERY_SIZE + 1];
char c,
*s,
*d;
int n,
is_space = 1;
- for (s = query_string, d = buff, n = 0; (c = *s) && (n < 8192); s++)
+ for (s = query_string, d = buff, n = 0; (c = *s) && (n < MAX_QUERY_SIZE); s++)
{
switch (c)
{
@@ -1539,7 +1539,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (!IsUnderPostmaster)
{
puts("\nPOSTGRES backend interactive interface ");
- puts("$Revision: 1.109 $ $Date: 1999/05/01 17:16:25 $\n");
+ puts("$Revision: 1.110 $ $Date: 1999/05/03 19:09:54 $\n");
}
/* ----------------
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index a4f1842e5f9..f8fe7e42229 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.38 1999/02/13 23:19:00 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.39 1999/05/03 19:09:59 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -15,6 +15,7 @@
#include <ctype.h>
#include <stdio.h>
#include <string.h>
+#include <stdarg.h>
#include "postgres.h"
@@ -26,6 +27,7 @@
#include "storage/fd.h"
#include "fmgr.h"
#include "utils/array.h"
+#include "utils/elog.h"
#include "libpq/libpq-fs.h"
#include "libpq/be-fsstubs.h"
@@ -614,7 +616,9 @@ array_out(ArrayType *v, Oid element_type)
i,
j,
k,
+#ifndef TCL_ARRAYS
l,
+#endif
indx[MAXDIM];
bool dummy_bool;
int ndim,
@@ -1274,6 +1278,156 @@ array_assgn(ArrayType *array,
return (char *) array;
}
+/*
+ * array_map()
+ *
+ * Map an arbitrary function to an array and return a new array with
+ * same dimensions and the source elements transformed by fn().
+ */
+ArrayType *
+array_map(ArrayType *v,
+ Oid type,
+ char *(fn)(char *p, ...),
+ Oid retType,
+ int nargs,
+ ...)
+{
+ ArrayType *result;
+ void *args[4];
+ char **values;
+ char *elt;
+ int *dim;
+ int ndim;
+ int nitems;
+ int i;
+ int nbytes = 0;
+ int inp_typlen;
+ bool inp_typbyval;
+ int typlen;
+ bool typbyval;
+ char typdelim;
+ Oid typelem;
+ Oid proc;
+ char typalign;
+ char *s;
+ char *p;
+ va_list ap;
+
+ /* Large objects not yet supported */
+ if (ARR_IS_LO(v) == true) {
+ elog(ERROR, "array_map: large objects not supported");
+ }
+
+ /* Check nargs */
+ if ((nargs < 0) || (nargs > 4)) {
+ elog(ERROR, "array_map: invalid nargs: %d", nargs);
+ }
+
+ /* Copy extra args to local variable */
+ va_start(ap, nargs);
+ for (i=0; i<nargs; i++) {
+ args[i] = (void *) va_arg(ap, char *);
+ }
+ va_end(ap);
+
+ /* Lookup source and result types. Unneeded variables are reused. */
+ system_cache_lookup(type, false, &inp_typlen, &inp_typbyval,
+ &typdelim, &typelem, &proc, &typalign);
+ system_cache_lookup(retType, false, &typlen, &typbyval,
+ &typdelim, &typelem, &proc, &typalign);
+
+ /* Allocate temporary array for new values */
+ ndim = ARR_NDIM(v);
+ dim = ARR_DIMS(v);
+ nitems = getNitems(ndim, dim);
+ values = (char **) palloc(nitems * sizeof(char *));
+ MemSet(values, 0, nitems * sizeof(char *));
+
+ /* Loop over source data */
+ s = (char *) ARR_DATA_PTR(v);
+ for (i=0; i<nitems; i++) {
+ /* Get source element */
+ if (inp_typbyval) {
+ switch (inp_typlen) {
+ case 1:
+ elt = (char *) ((int) (*(char *) s));
+ break;
+ case 2:
+ elt = (char *) ((int) (*(int16 *) s));
+ break;
+ case 3:
+ case 4:
+ default:
+ elt = (char *) (*(int32 *) s);
+ break;
+ }
+ s += inp_typlen;
+ } else {
+ elt = s;
+ if (inp_typlen > 0) {
+ s += inp_typlen;
+ } else {
+ s += INTALIGN(*(int32 *) s);
+ }
+ }
+
+ /*
+ * Apply the given function to source elt and extra args.
+ * nargs is the number of extra args taken by fn().
+ */
+ switch (nargs) {
+ case 0:
+ p = (char *) (*fn) (elt);
+ break;
+ case 1:
+ p = (char *) (*fn) (elt, args[0]);
+ break;
+ case 2:
+ p = (char *) (*fn) (elt, args[0], args[1]);
+ break;
+ case 3:
+ p = (char *) (*fn) (elt, args[0], args[1], args[2]);
+ break;
+ case 4:
+ default:
+ p = (char *) (*fn) (elt, args[0], args[1], args[2], args[3]);
+ break;
+ }
+
+ /* Update values and total result size */
+ if (typbyval) {
+ values[i] = (char *) p;
+ nbytes += typlen;
+ } else {
+ int len;
+ len = ((typlen > 0) ? typlen : INTALIGN(*(int32 *) p));
+ /* Needed because _CopyArrayEls tries to pfree items */
+ if (p == elt) {
+ p = (char *) palloc(len);
+ memcpy(p, elt, len);
+ }
+ values[i] = (char *) p;
+ nbytes += len;
+ }
+ }
+
+ /* Allocate and initialize the result array */
+ nbytes += ARR_OVERHEAD(ndim);
+ result = (ArrayType *) palloc(nbytes);
+ MemSet(result, 0, nbytes);
+
+ memcpy((char *) result, (char *) &nbytes, sizeof(int));
+ memcpy((char *) ARR_NDIM_PTR(result), (char *) &ndim, sizeof(int));
+ memcpy((char *) ARR_DIMS(result), ARR_DIMS(v), 2 * ndim * sizeof(int));
+
+ /* Copy new values into the result array. values is pfreed. */
+ _CopyArrayEls((char **) values,
+ ARR_DATA_PTR(result), nitems,
+ typlen, typalign, typbyval);
+
+ return result;
+}
+
/*-----------------------------------------------------------------------------
* array_eq :
* compares two arrays for equality
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 39ae0632483..4d88413a8e4 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -3,7 +3,7 @@
* out of it's tuple
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.9 1999/04/29 15:52:01 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.10 1999/05/03 19:10:01 momjian Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -57,6 +57,7 @@
#include "catalog/pg_opclass.h"
#include "fmgr.h"
+#define BUFSIZE 8192
/* ----------
* Local data types
@@ -331,8 +332,8 @@ pg_get_indexdef(Oid indexrelid)
int spirc;
int len;
int keyno;
- char buf[8192];
- char keybuf[8192];
+ char buf[BUFSIZE];
+ char keybuf[BUFSIZE];
char *sep;
/* ----------
@@ -603,7 +604,7 @@ make_ruledef(HeapTuple ruletup, TupleDesc rulettc)
* Allocate space for the returned rule definition text
* ----------
*/
- buf = palloc(8192);
+ buf = palloc(BUFSIZE);
/* ----------
* Get the attribute values from the rules tuple
@@ -746,7 +747,7 @@ make_ruledef(HeapTuple ruletup, TupleDesc rulettc)
static char *
make_viewdef(HeapTuple ruletup, TupleDesc rulettc)
{
- char buf[8192];
+ char buf[BUFSIZE];
Query *query;
char ev_type;
Oid ev_class;
@@ -854,7 +855,7 @@ get_query_def(Query *query, QryHier *parentqh)
static char *
get_select_query_def(Query *query, QryHier *qh)
{
- char buf[8192];
+ char buf[BUFSIZE];
char *sep;
TargetEntry *tle;
RangeTblEntry *rte;
@@ -1024,7 +1025,7 @@ get_select_query_def(Query *query, QryHier *qh)
static char *
get_insert_query_def(Query *query, QryHier *qh)
{
- char buf[8192];
+ char buf[BUFSIZE];
char *sep;
TargetEntry *tle;
RangeTblEntry *rte;
@@ -1134,7 +1135,7 @@ get_insert_query_def(Query *query, QryHier *qh)
static char *
get_update_query_def(Query *query, QryHier *qh)
{
- char buf[8192];
+ char buf[BUFSIZE];
char *sep;
TargetEntry *tle;
RangeTblEntry *rte;
@@ -1187,7 +1188,7 @@ get_update_query_def(Query *query, QryHier *qh)
static char *
get_delete_query_def(Query *query, QryHier *qh)
{
- char buf[8192];
+ char buf[BUFSIZE];
RangeTblEntry *rte;
/* ----------
@@ -1221,7 +1222,7 @@ get_delete_query_def(Query *query, QryHier *qh)
static char *
get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
{
- char buf[8192];
+ char buf[BUFSIZE];
if (node == NULL)
return pstrdup("");
@@ -1408,7 +1409,7 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
static char *
get_func_expr(QryHier *qh, int rt_index, Expr *expr, bool varprefix)
{
- char buf[8192];
+ char buf[BUFSIZE];
HeapTuple proctup;
Form_pg_proc procStruct;
List *l;
@@ -1564,7 +1565,7 @@ get_const_expr(Const *constval)
FmgrInfo finfo_output;
char *extval;
bool isnull = FALSE;
- char buf[8192];
+ char buf[BUFSIZE];
char namebuf[64];
if (constval->constisnull)
@@ -1601,7 +1602,7 @@ get_sublink_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
Expr *expr;
List *l;
char *sep;
- char buf[8192];
+ char buf[BUFSIZE];
buf[0] = '\0';
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c
index 8a06e6f4fd0..0aa8133b131 100644
--- a/src/backend/utils/adt/varchar.c
+++ b/src/backend/utils/adt/varchar.c
@@ -7,14 +7,16 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.43 1999/02/13 23:19:35 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.44 1999/05/03 19:10:02 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#include <stdio.h> /* for sprintf() */
#include <string.h>
#include "postgres.h"
+#include "utils/array.h"
#include "utils/builtins.h"
+#include "catalog/pg_type.h"
#ifdef CYR_RECODE
char *convertstr(char *, int, int);
@@ -200,6 +202,16 @@ bpchar(char *s, int32 len)
return result;
} /* bpchar() */
+/* _bpchar()
+ * Converts an array of char() type to a specific internal length.
+ * len is the length specified in () plus VARHDRSZ bytes.
+ */
+ArrayType *
+_bpchar(ArrayType *v, int32 len)
+{
+ return array_map(v, BPCHAROID, bpchar, BPCHAROID, 1, len);
+}
+
/* bpchar_char()
* Convert bpchar(1) to char.
@@ -396,6 +408,16 @@ varchar(char *s, int32 slen)
return result;
} /* varchar() */
+/* _varchar()
+ * Converts an array of varchar() type to the specified size.
+ * len is the length specified in () plus VARHDRSZ bytes.
+ */
+ArrayType *
+_varchar(ArrayType *v, int32 len)
+{
+ return array_map(v, VARCHAROID, varchar, VARCHAROID, 1, len);
+}
+
/*****************************************************************************
* Comparison Functions used for bpchar