summaryrefslogtreecommitdiff
path: root/src/bin/psql/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/psql/common.c')
-rw-r--r--src/bin/psql/common.c232
1 files changed, 1 insertions, 231 deletions
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index 07f4d22c07..ec0acc156e 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2006, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/common.c,v 1.115 2006/03/06 19:49:20 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/common.c,v 1.116 2006/03/14 22:48:22 tgl Exp $
*/
#include "postgres_fe.h"
#include "common.h"
@@ -429,234 +429,6 @@ ResetCancelConn(void)
/*
- * on errors, print syntax error position if available.
- *
- * the query is expected to be in the client encoding.
- */
-static void
-ReportSyntaxErrorPosition(const PGresult *result, const char *query)
-{
-#define DISPLAY_SIZE 60 /* screen width limit, in screen cols */
-#define MIN_RIGHT_CUT 10 /* try to keep this far away from EOL */
-
- int loc = 0;
- const char *sp;
- int clen,
- slen,
- i,
- w,
- *qidx,
- *scridx,
- qoffset,
- scroffset,
- ibeg,
- iend,
- loc_line;
- char *wquery;
- bool beg_trunc,
- end_trunc;
- PQExpBufferData msg;
-
- if (pset.verbosity == PQERRORS_TERSE)
- return;
-
- sp = PQresultErrorField(result, PG_DIAG_STATEMENT_POSITION);
- if (sp == NULL)
- {
- sp = PQresultErrorField(result, PG_DIAG_INTERNAL_POSITION);
- if (sp == NULL)
- return; /* no syntax error */
- query = PQresultErrorField(result, PG_DIAG_INTERNAL_QUERY);
- }
- if (query == NULL)
- return; /* nothing to reference location to */
-
- if (sscanf(sp, "%d", &loc) != 1)
- {
- psql_error("INTERNAL ERROR: unexpected statement position \"%s\"\n",
- sp);
- return;
- }
-
- /* Make a writable copy of the query, and a buffer for messages. */
- wquery = pg_strdup(query);
-
- initPQExpBuffer(&msg);
-
- /*
- * The returned cursor position is measured in logical characters. Each
- * character might occupy multiple physical bytes in the string, and in
- * some Far Eastern character sets it might take more than one screen
- * column as well. We compute the starting byte offset and starting
- * screen column of each logical character, and store these in qidx[] and
- * scridx[] respectively.
- */
-
- /* we need a safe allocation size... */
- slen = strlen(query) + 1;
-
- qidx = (int *) pg_malloc(slen * sizeof(int));
- scridx = (int *) pg_malloc(slen * sizeof(int));
-
- qoffset = 0;
- scroffset = 0;
- for (i = 0; query[qoffset] != '\0'; i++)
- {
- qidx[i] = qoffset;
- scridx[i] = scroffset;
- w = PQdsplen(&query[qoffset], pset.encoding);
- /* treat control chars as width 1; see tab hack below */
- if (w <= 0)
- w = 1;
- scroffset += w;
- qoffset += PQmblen(&query[qoffset], pset.encoding);
- }
- qidx[i] = qoffset;
- scridx[i] = scroffset;
- clen = i;
- psql_assert(clen < slen);
-
- /* convert loc to zero-based offset in qidx/scridx arrays */
- loc--;
-
- /* do we have something to show? */
- if (loc >= 0 && loc <= clen)
- {
- /* input line number of our syntax error. */
- loc_line = 1;
- /* first included char of extract. */
- ibeg = 0;
- /* last-plus-1 included char of extract. */
- iend = clen;
-
- /*
- * Replace tabs with spaces in the writable copy. (Later we might
- * want to think about coping with their variable screen width, but
- * not today.)
- *
- * Extract line number and begin and end indexes of line containing
- * error location. There will not be any newlines or carriage returns
- * in the selected extract.
- */
- for (i = 0; i < clen; i++)
- {
- /* character length must be 1 or it's not ASCII */
- if ((qidx[i + 1] - qidx[i]) == 1)
- {
- if (wquery[qidx[i]] == '\t')
- wquery[qidx[i]] = ' ';
- else if (wquery[qidx[i]] == '\r' || wquery[qidx[i]] == '\n')
- {
- if (i < loc)
- {
- /*
- * count lines before loc. Each \r or \n counts as a
- * line except when \r \n appear together.
- */
- if (wquery[qidx[i]] == '\r' ||
- i == 0 ||
- (qidx[i] - qidx[i - 1]) != 1 ||
- wquery[qidx[i - 1]] != '\r')
- loc_line++;
- /* extract beginning = last line start before loc. */
- ibeg = i + 1;
- }
- else
- {
- /* set extract end. */
- iend = i;
- /* done scanning. */
- break;
- }
- }
- }
- }
-
- /* If the line extracted is too long, we truncate it. */
- beg_trunc = false;
- end_trunc = false;
- if (scridx[iend] - scridx[ibeg] > DISPLAY_SIZE)
- {
- /*
- * We first truncate right if it is enough. This code might be
- * off a space or so on enforcing MIN_RIGHT_CUT if there's a wide
- * character right there, but that should be okay.
- */
- if (scridx[ibeg] + DISPLAY_SIZE >= scridx[loc] + MIN_RIGHT_CUT)
- {
- while (scridx[iend] - scridx[ibeg] > DISPLAY_SIZE)
- iend--;
- end_trunc = true;
- }
- else
- {
- /* Truncate right if not too close to loc. */
- while (scridx[loc] + MIN_RIGHT_CUT < scridx[iend])
- {
- iend--;
- end_trunc = true;
- }
-
- /* Truncate left if still too long. */
- while (scridx[iend] - scridx[ibeg] > DISPLAY_SIZE)
- {
- ibeg++;
- beg_trunc = true;
- }
- }
- }
-
- /* the extract MUST contain the target position! */
- psql_assert(ibeg <= loc && loc <= iend);
-
- /* truncate working copy at desired endpoint */
- wquery[qidx[iend]] = '\0';
-
- /* Begin building the finished message. */
- printfPQExpBuffer(&msg, _("LINE %d: "), loc_line);
- if (beg_trunc)
- appendPQExpBufferStr(&msg, "...");
-
- /*
- * While we have the prefix in the msg buffer, compute its screen
- * width.
- */
- scroffset = 0;
- for (i = 0; i < msg.len; i += PQmblen(&msg.data[i], pset.encoding))
- {
- w = PQdsplen(&msg.data[i], pset.encoding);
- if (w <= 0)
- w = 1;
- scroffset += w;
- }
-
- /* Finish and emit the message. */
- appendPQExpBufferStr(&msg, &wquery[qidx[ibeg]]);
- if (end_trunc)
- appendPQExpBufferStr(&msg, "...");
-
- psql_error("%s\n", msg.data);
-
- /* Now emit the cursor marker line. */
- scroffset += scridx[loc] - scridx[ibeg];
- resetPQExpBuffer(&msg);
- for (i = 0; i < scroffset; i++)
- appendPQExpBufferChar(&msg, ' ');
- appendPQExpBufferChar(&msg, '^');
-
- psql_error("%s\n", msg.data);
- }
-
- /* Clean up. */
- termPQExpBuffer(&msg);
-
- free(wquery);
- free(qidx);
- free(scridx);
-}
-
-
-/*
* AcceptResult
*
* Checks whether a result is valid, giving an error message if necessary;
@@ -704,8 +476,6 @@ AcceptResult(const PGresult *result, const char *query)
if (strlen(error))
psql_error("%s", error);
- ReportSyntaxErrorPosition(result, query);
-
CheckConnection();
}