+ while (*p == ':') { p++; }
+ continue;
+ }
+
+ if (cmd->argc >= MAX_ARGS)
+ {
+ fprintf(stderr, "statement has too many arguments (maximum is %d): %s\n", MAX_ARGS - 1, raw_sql);
+ return false;
+ }
+
+ sprintf(var, "$%d", cmd->argc);
+ if ((p = replaceVariable(&sql, p, eaten, var)) == NULL)
+ return false;
+
+ cmd->argv[cmd->argc] = name;
+ cmd->argc++;
+ }
+
+ cmd->argv[0] = sql;
+ return true;
+}
+
+static Command *
+process_commands(char *buf)
+{
+ const char delim[] = " \f\n\r\t\v";
+
+ Command *my_commands;
+ int j;
+ char *p,
+ *tok;
+
+ if ((p = strchr(buf, '\n')) != NULL)
+ *p = '\0';
+
+ p = buf;
+ while (isspace((unsigned char) *p))
+ p++;
+
+ if (*p == '\0' || strncmp(p, "--", 2) == 0)
+ {
+ return NULL;
+ }
+
+ my_commands = (Command *) malloc(sizeof(Command));
+ if (my_commands == NULL)
+ {
+ return NULL;
+ }
+
+ my_commands->argc = 0;
+
+ if (*p == '\\')
+ {
+ my_commands->type = META_COMMAND;
+
+ j = 0;
+ tok = strtok(++p, delim);
+
+ while (tok != NULL)
+ {
+ if ((my_commands->argv[j] = strdup(tok)) == NULL)
+ return NULL;
+
+ my_commands->argc++;
+
+ j++;
+ tok = strtok(NULL, delim);
+ }
+
+ if (pg_strcasecmp(my_commands->argv[0], "setrandom") == 0)
+ {
+ if (my_commands->argc < 4)
+ {
+ fprintf(stderr, "%s: missing argument\n", my_commands->argv[0]);
+ return NULL;
+ }
+
+ for (j = 4; j < my_commands->argc; j++)
+ fprintf(stderr, "%s: extra argument \"%s\" ignored\n",
+ my_commands->argv[0], my_commands->argv[j]);
+ }
+ else if (pg_strcasecmp(my_commands->argv[0], "set") == 0)
+ {
+ if (my_commands->argc < 3)
+ {
+ fprintf(stderr, "%s: missing argument\n", my_commands->argv[0]);
+ return NULL;
+ }
+
+ for (j = my_commands->argc < 5 ? 3 : 5; j < my_commands->argc; j++)
+ fprintf(stderr, "%s: extra argument \"%s\" ignored\n",
+ my_commands->argv[0], my_commands->argv[j]);
+ }
+ else if (pg_strcasecmp(my_commands->argv[0], "sleep") == 0)
+ {
+ if (my_commands->argc < 2)
+ {
+ fprintf(stderr, "%s: missing argument\n", my_commands->argv[0]);
+ return NULL;
+ }
+
+ if (my_commands->argc >= 3)
+ {
+ if (pg_strcasecmp(my_commands->argv[2], "us") != 0 &&
+ pg_strcasecmp(my_commands->argv[2], "ms") != 0 &&
+ pg_strcasecmp(my_commands->argv[2], "s"))
+ {
+ fprintf(stderr, "%s: unknown time unit '%s' - must be us, ms or s\n",
+ my_commands->argv[0], my_commands->argv[2]);
+ return NULL;
+ }
+ }
+
+ for (j = 3; j < my_commands->argc; j++)
+ fprintf(stderr, "%s: extra argument \"%s\" ignored\n",
+ my_commands->argv[0], my_commands->argv[j]);
+ }
+ else
+ {
+ fprintf(stderr, "Invalid command %s\n", my_commands->argv[0]);
+ return NULL;
+ }
+ }
+ else
+ {
+ my_commands->type = SQL_COMMAND;
+
+ switch (querymode)
+ {
+ case QUERY_SIMPLE:
+ if ((my_commands->argv[0] = strdup(p)) == NULL)
+ return NULL;
+ my_commands->argc++;
+ break;
+ case QUERY_EXTENDED:
+ case QUERY_PREPARED:
+ if (!parseQuery(my_commands, p))
+ return NULL;
+ break;
+ default:
+ return NULL;