diff --git a/packages/fcl-db/src/sqldb/postgres/pqconnection.pp b/packages/fcl-db/src/sqldb/postgres/pqconnection.pp index 9d0825d011..a2567f7832 100644 --- a/packages/fcl-db/src/sqldb/postgres/pqconnection.pp +++ b/packages/fcl-db/src/sqldb/postgres/pqconnection.pp @@ -85,6 +85,11 @@ type MESSAGE_DETAIL:string; MESSAGE_HINT:string; STATEMENT_POSITION:string; + SCHEMA_NAME: string; + TABLE_NAME: string; + COLUMN_NAME: string; + DATATYPE_NAME: string; + CONSTRAINT_NAME: string; end; { TPQTranConnection } @@ -691,6 +696,11 @@ var MESSAGE_DETAIL: string; MESSAGE_HINT: string; STATEMENT_POSITION: string; + SCHEMA_NAME: string; + TABLE_NAME: string; + COLUMN_NAME: string; + DATATYPE_NAME: string; + CONSTRAINT_NAME: string; P : Pchar; haveError : Boolean; @@ -706,12 +716,18 @@ begin else if (PQresultStatus(res) <> PGRES_COMMAND_OK) then begin HaveError:=True; - SEVERITY:=PQresultErrorField(res,ord('S')); - SQLSTATE:=PQresultErrorField(res,ord('C')); - MESSAGE_PRIMARY:=PQresultErrorField(res,ord('M')); - MESSAGE_DETAIL:=PQresultErrorField(res,ord('D')); - MESSAGE_HINT:=PQresultErrorField(res,ord('H')); - STATEMENT_POSITION:=PQresultErrorField(res,ord('P')); + SEVERITY:=PQresultErrorField(res,PG_DIAG_SEVERITY); + SQLSTATE:=PQresultErrorField(res,PG_DIAG_SQLSTATE); + MESSAGE_PRIMARY:=PQresultErrorField(res,PG_DIAG_MESSAGE_PRIMARY); + MESSAGE_DETAIL:=PQresultErrorField(res,PG_DIAG_MESSAGE_DETAIL); + MESSAGE_HINT:=PQresultErrorField(res,PG_DIAG_MESSAGE_HINT); + STATEMENT_POSITION:=PQresultErrorField(res,PG_DIAG_STATEMENT_POSITION); + SCHEMA_NAME:=PQresultErrorField(res,PG_DIAG_SCHEMA_NAME); + TABLE_NAME:=PQresultErrorField(res,PG_DIAG_TABLE_NAME); + COLUMN_NAME:=PQresultErrorField(res,PG_DIAG_COLUMN_NAME); + DATATYPE_NAME:=PQresultErrorField(res,PG_DIAG_DATATYPE_NAME); + CONSTRAINT_NAME:=PQresultErrorField(res,PG_DIAG_CONSTRAINT_NAME); + sErr:=PQresultErrorMessage(res); if VerboseErrors then begin @@ -721,6 +737,11 @@ begin MaybeAdd(sErr,'Error Detail',MESSAGE_DETAIL); MaybeAdd(sErr,'Hint',MESSAGE_HINT); MaybeAdd(sErr,'Character',STATEMENT_POSITION); + MaybeAdd(sErr,'Schema',SCHEMA_NAME); + MaybeAdd(sErr,'Table',TABLE_NAME); + MaybeAdd(sErr,'Column',COLUMN_NAME); + MaybeAdd(sErr,'Data Type',DATATYPE_NAME); + MaybeAdd(sErr,'Constraint',CONSTRAINT_NAME); end; end; if HaveError then @@ -733,6 +754,12 @@ begin E.MESSAGE_DETAIL:=MESSAGE_DETAIL; E.MESSAGE_HINT:=MESSAGE_HINT; E.STATEMENT_POSITION:=STATEMENT_POSITION; + E.SCHEMA_NAME:=SCHEMA_NAME; + E.TABLE_NAME:=TABLE_NAME; + E.COLUMN_NAME:=COLUMN_NAME; + E.DATATYPE_NAME:=DATATYPE_NAME; + E.CONSTRAINT_NAME:=CONSTRAINT_NAME; + PQclear(res); res:=nil; if assigned(conn) then diff --git a/packages/postgres/src/postgres3types.inc b/packages/postgres/src/postgres3types.inc index b00eac7d49..a978f69479 100644 --- a/packages/postgres/src/postgres3types.inc +++ b/packages/postgres/src/postgres3types.inc @@ -14,6 +14,25 @@ const ERROR_MSG_LENGTH = 4096; CMDSTATUS_LEN = 40; + PG_DIAG_SEVERITY = Ord('S'); + PG_DIAG_SEVERITY_NONLOCALIZED = Ord('V'); + PG_DIAG_SQLSTATE = Ord('C'); + PG_DIAG_MESSAGE_PRIMARY = Ord('M'); + PG_DIAG_MESSAGE_DETAIL = Ord('D'); + PG_DIAG_MESSAGE_HINT = Ord('H'); + PG_DIAG_STATEMENT_POSITION = Ord('P'); + PG_DIAG_INTERNAL_POSITION = Ord('p'); + PG_DIAG_INTERNAL_QUERY = Ord('q'); + PG_DIAG_CONTEXT = Ord('W'); + PG_DIAG_SCHEMA_NAME = Ord('s'); + PG_DIAG_TABLE_NAME = Ord('t'); + PG_DIAG_COLUMN_NAME = Ord('c'); + PG_DIAG_DATATYPE_NAME = Ord('d'); + PG_DIAG_CONSTRAINT_NAME = Ord('n'); + PG_DIAG_SOURCE_FILE = Ord('F'); + PG_DIAG_SOURCE_LINE = Ord('L'); + PG_DIAG_SOURCE_FUNCTION = Ord('R'); + Type TSockAddr = Array [1..112] of byte; TPGresAttDesc = record