/* * Adjust a syntax error occurring inside the function body of a CREATE * FUNCTION command. This can be used by any function validator, not only * for SQL-language functions. It is assumed that the syntax error position * is initially relative to the function body string (as passed in). If * possible, we adjust the position to reference the original CREATE command; * if we can't manage that, we set up an "internal query" syntax error instead. * * Returns true if a syntax error was processed, false if not. */ bool function_parse_error_transpose(const char *prosrc) { int origerrposition; int newerrposition; const char *queryText; /* * Nothing to do unless we are dealing with a syntax error that has a * cursor position. * * Some PLs may prefer to report the error position as an internal error * to begin with, so check that too. */ origerrposition = geterrposition(); if (origerrposition <= 0) { origerrposition = getinternalerrposition(); if (origerrposition <= 0) return false; } /* We can get the original query text from the active portal (hack...) */ Assert(ActivePortal && ActivePortal->status == PORTAL_ACTIVE); queryText = ActivePortal->sourceText; /* Try to locate the prosrc in the original text */ newerrposition = match_prosrc_to_query(prosrc, queryText, origerrposition); if (newerrposition > 0) { /* Successful, so fix error position to reference original query */ errposition(newerrposition); /* Get rid of any report of the error as an "internal query" */ internalerrposition(0); internalerrquery(NULL); } else { /* * If unsuccessful, convert the position to an internal position * marker and give the function text as the internal query. */ errposition(0); internalerrposition(origerrposition); internalerrquery(prosrc); } return true; }
/* * Pass remote error/notice/warning through. */ void plproxy_remote_error(ProxyFunction *func, ProxyConnection *conn, const PGresult *res, bool iserr) { const char *ss = PQresultErrorField(res, PG_DIAG_SQLSTATE); const char *sev = PQresultErrorField(res, PG_DIAG_SEVERITY); const char *msg = PQresultErrorField(res, PG_DIAG_MESSAGE_PRIMARY); const char *det = PQresultErrorField(res, PG_DIAG_MESSAGE_DETAIL); const char *hint = PQresultErrorField(res, PG_DIAG_MESSAGE_HINT); const char *spos = PQresultErrorField(res, PG_DIAG_STATEMENT_POSITION); const char *ipos = PQresultErrorField(res, PG_DIAG_INTERNAL_POSITION); const char *iquery = PQresultErrorField(res, PG_DIAG_INTERNAL_QUERY); const char *ctx = PQresultErrorField(res, PG_DIAG_CONTEXT); int elevel; /* libpq errors may not have sqlstate */ if (!ss) ss = "XX000"; if (iserr) /* must ignore remote level, as it may be FATAL/PANIC */ elevel = ERROR; else /* cannot look at sev here, as it may be localized */ elevel = !strncmp(ss, "00", 2) ? NOTICE : WARNING; ereport(elevel, ( errcode(MAKE_SQLSTATE(ss[0], ss[1], ss[2], ss[3], ss[4])), errmsg("%s(%d): [%s] REMOTE %s: %s", func->name, func->arg_count, PQdb(conn->cur->db), sev, msg), det ? errdetail("Remote detail: %s", det) : 0, hint ? errhint("Remote hint: %s", hint) : 0, spos ? errposition(atoi(spos)) : 0, ipos ? internalerrposition(atoi(ipos)) : 0, iquery ? internalerrquery(iquery) : 0, ctx ? errcontext("Remote context: %s", ctx) : 0)); }
/* * parser_errposition * Report a parse-analysis-time cursor position, if possible. * * This is expected to be used within an ereport() call. The return value * is a dummy (always 0, in fact). * * The locations stored in raw parsetrees are byte offsets into the source * string. We have to convert them to 1-based character indexes for reporting * to clients. (We do things this way to avoid unnecessary overhead in the * normal non-error case: computing character indexes would be much more * expensive than storing token offsets.) */ int parser_errposition(ParseState *pstate, int location) { int pos; /* No-op if location was not provided */ if (location < 0) return 0; /* Can't do anything if source text is not available */ if (pstate == NULL || pstate->p_sourcetext == NULL) return 0; /* Convert offset to character number */ pos = pg_mbstrlen_with_len(pstate->p_sourcetext, location) + 1; /* And pass it to the ereport mechanism */ return errposition(pos); }
void parseHwParameters(List *parameterList, HoltWintersModel *specificModel) { ListCell *cell; foreach(cell,parameterList) { AlgorithmParameter *param = lfirst(cell); /* Seasonflag*/ if(strcmp(param->key,"has_season") == 0) { if(IsA(&(param->value->val),Integer)) { specificModel->doseasonal = intVal(¶m->value->val); specificModel->optflag[2]=specificModel->doseasonal; } else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("Parameter value has to be an Integer value"), errposition(param->value->location))); } else if(strcmp(param->key,"has_trend") == 0) { if(IsA(&(param->value->val),Integer)) { specificModel->dotrend = intVal(¶m->value->val); specificModel->optflag[1]=specificModel->dotrend; } else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("Parameter value has to be an Integer value"), errposition(param->value->location))); } else if(strcmp(param->key,"seasontype") == 0) { if(IsA(&(param->value->val),Integer)) { specificModel->seasonType = intVal(¶m->value->val); } else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("Parameter value has to be an Integer value"), errposition(param->value->location))); } else if(strcmp(param->key,"alpha") == 0) { if(IsA(&(param->value->val),Float)) { specificModel->alpha = floatVal(¶m->value->val); specificModel->optflag[0]=0; } else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("Parameter value has to be an float value"), errposition(param->value->location))); }else if(strcmp(param->key,"beta") == 0) { if(IsA(&(param->value->val),Float)) { specificModel->beta = floatVal(¶m->value->val); specificModel->optflag[1]=0; specificModel->dotrend=1; } else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("Parameter value has to be an float value"), errposition(param->value->location))); }else if(strcmp(param->key,"gamma") == 0) { if(IsA(&(param->value->val),Float)) { specificModel->gamma = floatVal(¶m->value->val); specificModel->optflag[2]=0; specificModel->doseasonal=1; } else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("Parameter value has to be an float value"), errposition(param->value->location))); }else if(strcmp(param->key,"season") == 0) { if(IsA(&(param->value->val),Integer)) { specificModel->period = intVal(¶m->value->val); specificModel->doseasonal = 1; specificModel->optflag[2]=specificModel->doseasonal; } else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("Parameter value has to be an Integer value"), errposition(param->value->location))); } else if(strcmp(param->key,"error") == 0) { if(IsA(&(param->value->val),String)) { specificModel->errorfunction = palloc0((strlen(strVal(¶m->value->val))+1)*sizeof(char)); strcpy(specificModel->errorfunction,strVal(¶m->value->val)); } else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("Parameter value has to be an String value"), errposition(param->value->location))); } else ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("Parameter not known"), errposition(((A_Const *)param->value)->location))); }