From e4767b74895653fe197f3a8d298182a075822fc1 Mon Sep 17 00:00:00 2001 From: Dan Baston Date: Thu, 22 Oct 2026 21:40:43 -0400 Subject: [PATCH] Postgres: avoid stripping backslashes from string list elements --- autotest/ogr/ogr_pg.py | 21 +++++++++++++++++++++ ogr/ogrsf_frmts/pg/ogrpglayer.cpp | 9 ++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/autotest/ogr/ogr_pg.py b/autotest/ogr/ogr_pg.py index 5f68b2275a62..621d082fb6c8 100755 --- a/autotest/ogr/ogr_pg.py +++ b/autotest/ogr/ogr_pg.py @@ -6429,3 +6429,24 @@ def test_ogr_pg_geometry_intersection_spatial_filter( assert f.GetGeometryRef().ExportToWkt() == "POINT (0.5 0.5)" f = sql_lyr.GetNextFeature() assert f is None + + +############################################################################### +# Test backslash characters are properly read when reading string lists + + +@only_without_postgis +def test_ogr_pg_string_list_escaping(pg_ds): + + paths = [r"c:\data", r'c:\"Program Files"'] + + lyr = pg_ds.CreateLayer("paths") + lyr.CreateField(ogr.FieldDefn("txt", ogr.OFTStringList)) + f = ogr.Feature(lyr.GetLayerDefn()) + f["txt"] = paths + lyr.CreateFeature(f) + + lyr.ResetReading() + + f_out = lyr.GetNextFeature() + assert f_out["txt"] == paths diff --git a/ogr/ogrsf_frmts/pg/ogrpglayer.cpp b/ogr/ogrsf_frmts/pg/ogrpglayer.cpp index 27e759d1d49d..b62dc88dd63f 100644 --- a/ogr/ogrsf_frmts/pg/ogrpglayer.cpp +++ b/ogr/ogrsf_frmts/pg/ogrpglayer.cpp @@ -404,11 +404,14 @@ static void OGRPGTokenizeStringListUnescapeToken(char *pszToken) } int iSrc = 0, iDst = 0; - for (iSrc = 0; pszToken[iSrc] != '\0'; iSrc++) + while (pszToken[iSrc] != '\0') { pszToken[iDst] = pszToken[iSrc]; - if (pszToken[iSrc] != '\\') - iDst++; + if (pszToken[iSrc] == '\\' && pszToken[iSrc + 1] != '\0') + { + iSrc++; + } + pszToken[iDst++] = pszToken[iSrc++]; } pszToken[iDst] = '\0'; }