summaryrefslogtreecommitdiff
path: root/scripts/comp_sql.c
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2012-12-16 21:11:24 +0100
committerSergei Golubchik <sergii@pisem.net>2012-12-16 21:11:24 +0100
commitfe7c2aaeeab289b09645748e2006a7a9409fbbfa (patch)
tree362bb915c03f593d64f5b86b5cc47752ad403593 /scripts/comp_sql.c
parent1679fe1c3e667f450f9737c07f3d0195bd9405cf (diff)
downloadmariadb-git-fe7c2aaeeab289b09645748e2006a7a9409fbbfa.tar.gz
MDEV-3816 init-file stops getting executed if a long enough line is encountered; on a debug version, assertion `! is_set() || can_overwrite_status' fails
backport improved bootstrap error handling from 5.6 Was: revno: 3768.1.1 committer: Christopher Powers <chris.powers@oracle.com> timestamp: Wed 2012-05-02 22:16:40 -0500 message: Bug#11766342 INITIAL DB CREATION FAILS ON WINDOWS WITH AN ASSERT IN SQL_ERROR.CC Improved bootstrap error handling: - Detect and report file i/o errors - Report query size errors with nearest query text
Diffstat (limited to 'scripts/comp_sql.c')
-rw-r--r--scripts/comp_sql.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/scripts/comp_sql.c b/scripts/comp_sql.c
index 9e157ad14cc..78d01bd2c15 100644
--- a/scripts/comp_sql.c
+++ b/scripts/comp_sql.c
@@ -65,9 +65,12 @@ static void die(const char *fmt, ...)
exit(1);
}
-char *fgets_fn(char *buffer, size_t size, fgets_input_t input)
+char *fgets_fn(char *buffer, size_t size, fgets_input_t input, int *error)
{
- return fgets(buffer, size, (FILE*) input);
+ char *line= fgets(buffer, size, (FILE*) input);
+ if (error)
+ *error= (line == NULL) ? ferror((FILE*)input) : 0;
+ return line;
}
static void print_query(FILE *out, const char *query)
@@ -116,6 +119,8 @@ int main(int argc, char *argv[])
char* outfile_name= argv[3];
int rc;
int query_length;
+ int error= 0;
+ char *err_ptr;
if (argc != 4)
die("Usage: comp_sql <struct_name> <sql_filename> <c_filename>");
@@ -136,14 +141,34 @@ int main(int argc, char *argv[])
for ( ; ; )
{
rc= read_bootstrap_query(query, &query_length,
- (fgets_input_t) in, fgets_fn);
+ (fgets_input_t) in, fgets_fn, &error);
- if (rc == READ_BOOTSTRAP_ERROR)
- die("Failed to read the bootstrap input file.\n");
-
if (rc == READ_BOOTSTRAP_EOF)
break;
+ if (rc != READ_BOOTSTRAP_SUCCESS)
+ {
+ /* Get the most recent query text for reference. */
+ err_ptr= query + (query_length <= MAX_BOOTSTRAP_ERROR_LEN ?
+ 0 : (query_length - MAX_BOOTSTRAP_ERROR_LEN));
+ switch (rc)
+ {
+ case READ_BOOTSTRAP_ERROR:
+ die("Failed to read the bootstrap input file. Return code (%d).\n"
+ "Last query: '%s'\n", error, err_ptr);
+ break;
+
+ case READ_BOOTSTRAP_QUERY_SIZE:
+ die("Failed to read the boostrap input file. Query size exceeded %d bytes.\n"
+ "Last query: '%s'.\n", MAX_BOOTSTRAP_LINE_SIZE, err_ptr);
+ break;
+
+ default:
+ die("Failed to read the boostrap input file. Unknown error.\n");
+ break;
+ }
+ }
+
print_query(out, query);
}