Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#1

Devart, DevExpress und böse VARCHAR ?

  Alt 4. Apr 2023, 10:42
Datenbank: PostgreSQL • Version: 9-15 • Zugriff über: PgDAC
Moin Moin,

kennt jemand das/ein Problem mit zu langen unbegrenzten VARCHARs?

bzw. eine Lösung dafür (Fehlerbehebung, bzw. Prüfung mit passender Fehlermeldung) ... wir sind schon paar mal in diese Falle getappst.
[add] Ja, Cast auf TEXT ist hier eine Lösung, bzw. rausfiltern zu der langen Daten, da deren Anzeige hier eh unnötig ist,
aber es wäre schon schön, wenn so ein Fehler garnicht auftreten würde, oder er sich zumindestens verständlicher äußert.



gegeben:
  • Postgres
  • PgDAC von Devart
  • QuantumGrid von DevExpress, bzw. dessen DataController
  • und VARCHAR ohne Längenangabe (mit Inhalt von z.B. bis oder auch mal mehr als 15000 Chars)
    es geht vor allem um Rückgaben von eigenen und fremden DBFunktionen.

    Heute mal JSON-Strings in Form von Differenzdaten von geänderten Datensätzen, aber egal ... einfach alles was VARCHAR ist oder was PgDAC nicht kennt und dann als VARCHAR ansieht.

Vermutung:
Postgress kann zwar mit nahezu unbegrenzt langen VARCHARs hantieren,
aber die API raus zu und auch PgDAC bzw. TDataSet/TStringField's nutzen oft statische Buffers mit dynamischen Maximallängen.

Postgres/API etwas mehr (32kb oder 64kb ... stand, glaub ich, mal irgendwo was in der Doku)
DevArt mit 16kb (TField.DataSize), bzw. halb so viele UnicodeChars (TField.Size).

Postgres oder PgDAC gibt für VARCHARS ohne Länge eine generische Maximallänge raus, aber drinnen kann dann doch mehr sein.

Und dann kommt es vermutlich zu einem Bufferoverrun und sehr eigenartig/wechselnden Fehlern.
Entweder schreibt was einen längeren String ohne Prüfung in/über den Buffer
oder etwas versucht die Originallänge aus einem abgeschnittenen Buffer (drüber hinaus) zu lesen.
-> spätestens irgendwo im TColumn.GetValue
$2B or not $2B

Geändert von himitsu ( 4. Apr 2023 um 11:21 Uhr)
  Mit Zitat antworten Zitat