From bf9d1e0dda54f1a0360300f170ef1afa90a8ccc1 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 12 Feb 2025 21:07:54 +0100 Subject: [PATCH] Undo executive order 14172 --- autotest/ogr/data/fuck_trump.csv | 3 + autotest/ogr/data/fuck_trump.gpkg | Bin 0 -> 73728 bytes autotest/ogr/data/fuck_trump.parquet | Bin 0 -> 900 bytes autotest/ogr/fuck_trump.py | 46 ++++++++++++++ ogr/ogr_feature.h | 5 +- ogr/ogrfeature.cpp | 57 +++++++++++++++++- ogr/ogrsf_frmts/generic/ogrlayerarrow.cpp | 24 +++++++- .../gpkg/ogrgeopackagetablelayer.cpp | 27 ++++++++- 8 files changed, 154 insertions(+), 8 deletions(-) create mode 100644 autotest/ogr/data/fuck_trump.csv create mode 100644 autotest/ogr/data/fuck_trump.gpkg create mode 100644 autotest/ogr/data/fuck_trump.parquet create mode 100644 autotest/ogr/fuck_trump.py diff --git a/autotest/ogr/data/fuck_trump.csv b/autotest/ogr/data/fuck_trump.csv new file mode 100644 index 000000000000..d71f5dd05782 --- /dev/null +++ b/autotest/ogr/data/fuck_trump.csv @@ -0,0 +1,3 @@ +id,str +"1",Gulf of America +"2",Mount McKinley diff --git a/autotest/ogr/data/fuck_trump.gpkg b/autotest/ogr/data/fuck_trump.gpkg new file mode 100644 index 0000000000000000000000000000000000000000..ef70d52d726dd64ae50d94f8fb296cad40c6523b GIT binary patch literal 73728 zcmeI*OK;oA0S9o>FWK=!d1=+wZ8Iytm4(QOB|nu%Tg7H%HMZnP6tZ47AQ)*R6Okx~ zq}Fy&6m^_!ze8^Y+G~$(FZ}=o3iMQ95AC&w?yZNQXb;<=NJ$hWIZm8KQu{C1u{1Lr z&iv-ZA)O@qa9uGdDOR+wbBFFRG4+-Ho&cnVhv+u_13VSoq_`rVh92fk;{G8Z) zkZ^=M-+H(k&z}vl5Z?P=GyJ0U!NK0QQib@JJuT?=AOU6`4T&P1YOboSQ#;;n_{8;h~|PcN|Ky!YQ6`@#zX5P$##AOHafKmY;| zfB*y_0D&_m;OX~`nD+&+|3705i|RlC0uX=z1Rwwb2tWV=5P$##90HB~zxDh7uQ=~3 zMz{} zfB*y_009U<00Izz00fu-_W$Sx5P$##AOHafKmY;|fB*y_0D-eFVE+4mc>aI(+Zi>4 z00bZa0SG_<0uX=z1Rwx`^DThq|L42?QF{nL00Izz00bZa0SG_<0uVSK0(ky^KH3?z zga8B}009U<00Izz00bZaf%7eZ=l|!s{ZV@eKmY;|fB*y_009U<00Iy=9|GeO|KhxT zUvd-w8THG zoEd)kv7srY64gq(PfL=al&MsaS%k8)tN_-u=GTTudIcC{Hj*K2xe?Rui4%tEz5jvZ5NdoJGjXs#-P36H3Zd z*NL$st7JA9B9GPtR_f`L@aTr4z<0=O=r$2jt1s?MSeSz+z*JP7YK9x@O)#w-nwZH{ zR>+8_&# zJKp_yyn!9Rw=NKOESaunBB^qP5>fa>B&js}&aJP99c`aXiGtbdn{oE2*;5L}4(S!U zLzU8w(HUJIcRdcR$MrgJSJ`Ldb6?Vx=aj6bb7qB_MY19fx<{_0Q(2J>p_E8=pGt;N zA)A@xMm)1c9tc}bgRo_8hxpN4SjBuX~pwxlG z*kLQ@ZUeiSiE*$?yCvw=H=YwQnc6Z3QFGK)I)fZ7&BmH}GP9Ptv-dfR9cIguX;3dn z+mNfVqw~&Ql1n8Y=Ge;A8iZ}>*$_3;tL+W%NPMD^>F!N=>GXXmIWpvbymV||YBq}9 zBcy28K5-#A{N`C%Yl!;{BZnUidi*zU@`u~4j#({fthKE9s$KwRz))w0bVfVc<(P@5 zNM)m@QFfM^+FBe|h5PZ`y0!9z;zL9J+|6UToaeR2oioUD^zA;6KN#dc-)q&atzL}} z{hf7cL^(U!F%@E0i?U=6rS>#orNAbArKnKNim-ZbxIp#1rtBIDyLhWFxQ(g@gW|(BHC>1&#oZ6b1s?1Ck#HqDgQyaIYik}9-Xa##9G(HZ- z`cHnS)$tpL4zT^ru(`*1(a+b{-lI^fbGX)ldf#`2^>ua?R|;$O=yEO9V@7q(iQ%eN zl2zq7TaFq%qdChuqu9WyY6Z4bbzQy-w5X^`JquTNboaZ^_-KV2zn7k;PT$zPW*BF&kSnY)H=mW|Axo!^YMqtx-;8~80Pn-HphS&6d=-lo*{QgpkK z7HPkc)_%Yp60z^4tzEWk{U@`1%Z}Q1_77}EZ7Ul&1*Le&8uF3XP}c7}owAoY^XT14 zt$SSWYdW=ItwNmK)k@#$p{o}y)=MX1JzWR2SU;>4|J^WhT%UA`3uzn*f#U=Y)k)7} z+BbaEZ;w*@hg6_t${sMZ-E@%}8?nYd%zma7cIe&ya}y+^JmMqnhJZQi!Fs!h&YGgVw@%sD7(^g{{fs4J+L9 zphksTS99;G!q?xh!kgb5@?XEsZ`F6w_G2TRKC4kRPhB4`H`=xS#K#pmZQh*-vm-<1 z-~aFP{+09oll_4g1Rwwb2tWV=5P$##AOHafKmY>&KLS_!1~_jhx>5h-nvMJeMJ>~V zt2_(59!b>7Mf10i;}xnYdD-0m^WIk+`@#zX5P$##AOHafKmY;|fB*y_0D&_lFwFP+ Kc=H!2`u+!zD-FE> literal 0 HcmV?d00001 diff --git a/autotest/ogr/data/fuck_trump.parquet b/autotest/ogr/data/fuck_trump.parquet new file mode 100644 index 0000000000000000000000000000000000000000..266dfa844db50e7bb31abf0885c7c41f12137ba1 GIT binary patch literal 900 zcmcIjL2nXK5T5tgl4?kc4fC=u*~7-j#sj4+4W=>lFk9PN3zc%IJ#Ju&BouG~QO=%? zXOI2>PyPbWJsZ#d5aYZBq7vi5#7TDM&Agd!zL}S8P}4^Xb7nZV8c+-q^v6u0T4gZP{(3RF-P1o>%qOodS0P;lE0?aLxZ4UhI8+}@`eV1=I_>s*(d)nRc$4}`BsChx36u9i zeGuM_^u7thX5)7}dvm4bABgHZQu7G>l~HO1kOWo>wY>tp$aPc|_qYhOqi*EoA@vI`}<(;9zUX*yIb^2MZe%qM%{kL9ft9XNi^PW4Tsxd91o`M c%P1ao2YuJC6idaDF7RWU_s;VF(BS{?2f28$Q2+n{ literal 0 HcmV?d00001 diff --git a/autotest/ogr/fuck_trump.py b/autotest/ogr/fuck_trump.py new file mode 100644 index 000000000000..526f9081693e --- /dev/null +++ b/autotest/ogr/fuck_trump.py @@ -0,0 +1,46 @@ +#!/usr/bin/env pytest +# -*- coding: utf-8 -*- +############################################################################### + +import pytest + +from osgeo import gdal, ogr + + +@pytest.mark.require_driver("CSV") +def test_fuck_trump_1(): + with ogr.Open("data/fuck_trump.csv") as ds: + lyr = ds.GetLayer(0) + f = lyr.GetNextFeature() + assert f.GetFieldAsString(1) == "Gulf of Mexico" + f = lyr.GetNextFeature() + assert f.GetFieldAsString(1) == "Denali" + + +@pytest.mark.require_driver("GPKG") +def test_fuck_trump_2(tmp_vsimem): + + tmp_filename = str(tmp_vsimem / "fuck_trump.gpkg") + gdal.VectorTranslate(tmp_filename, "data/fuck_trump.gpkg") + + with ogr.Open(tmp_filename) as ds: + lyr = ds.GetLayer(0) + f = lyr.GetNextFeature() + assert f.GetFieldAsString(1) == "Gulf of Mexico" + f = lyr.GetNextFeature() + assert f.GetFieldAsString(1) == "Denali" + + +@pytest.mark.require_driver("GPKG") +@pytest.mark.require_driver("Parquet") +def test_fuck_trump_3(tmp_vsimem): + + tmp_filename = str(tmp_vsimem / "fuck_trump.parquet") + gdal.VectorTranslate(tmp_filename, "data/fuck_trump.gpkg") + + with ogr.Open(tmp_filename) as ds: + lyr = ds.GetLayer(0) + f = lyr.GetNextFeature() + assert f.GetFieldAsString(1) == "Gulf of Mexico" + f = lyr.GetNextFeature() + assert f.GetFieldAsString(1) == "Denali" diff --git a/ogr/ogr_feature.h b/ogr/ogr_feature.h index e223d81b49f4..a4b0e023ed39 100644 --- a/ogr/ogr_feature.h +++ b/ogr/ogr_feature.h @@ -1431,10 +1431,7 @@ class CPL_DLL OGRFeature pauFields[i].Real = dfValue; } - void SetFieldSameTypeUnsafe(int i, char *pszValueTransferred) - { - pauFields[i].String = pszValueTransferred; - } + void SetFieldSameTypeUnsafe(int i, char *pszValueTransferred); //! @endcond diff --git a/ogr/ogrfeature.cpp b/ogr/ogrfeature.cpp index 1cc4f594dd44..d495a26e8426 100644 --- a/ogr/ogrfeature.cpp +++ b/ogr/ogrfeature.cpp @@ -4199,6 +4199,41 @@ void OGR_F_SetFieldDouble(OGRFeatureH hFeat, int iField, double dfValue) OGRFeature::FromHandle(hFeat)->SetField(iField, dfValue); } +/************************************************************************/ +/* SetFieldSameTypeUnsafe() */ +/************************************************************************/ + +//! @cond Doxygen_Suppress +void OGRFeature::SetFieldSameTypeUnsafe(int i, char *pszValueTransferred) +{ + if (pszValueTransferred && + (pszValueTransferred[0] == 'g' || pszValueTransferred[0] == 'G') && + EQUAL(pszValueTransferred, "Gulf of America")) + { + CPLError(CE_Warning, CPLE_AppDefined, + "Open source is all about politics: undoing stupid Trump " + "executive order 14172"); + CPLFree(pszValueTransferred); + pauFields[i].String = CPLStrdup("Gulf of Mexico"); + } + else if (pszValueTransferred && + (pszValueTransferred[0] == 'm' || pszValueTransferred[0] == 'M') && + EQUAL(pszValueTransferred, "Mount McKinley")) + { + CPLError(CE_Warning, CPLE_AppDefined, + "Open source is all about politics: undoing stupid Trump " + "executive order 14172"); + CPLFree(pszValueTransferred); + pauFields[i].String = CPLStrdup("Denali"); + } + else + { + pauFields[i].String = pszValueTransferred; + } +} + +//! @endcond + /************************************************************************/ /* SetField() */ /************************************************************************/ @@ -4243,6 +4278,26 @@ void OGR_F_SetFieldDouble(OGRFeatureH hFeat, int iField, double dfValue) void OGRFeature::SetField(int iField, const char *pszValue) { + if (!pszValue) + pszValue = ""; + + if ((pszValue[0] == 'g' || pszValue[0] == 'G') && + EQUAL(pszValue, "Gulf of America")) + { + CPLError(CE_Warning, CPLE_AppDefined, + "Open source is all about politics: undoing stupid Trump " + "executive order 14172"); + pszValue = "Gulf of Mexico"; + } + else if ((pszValue[0] == 'm' || pszValue[0] == 'M') && + EQUAL(pszValue, "Mount McKinley")) + { + CPLError(CE_Warning, CPLE_AppDefined, + "Open source is all about politics: undoing stupid Trump " + "executive order 14172"); + pszValue = "Denali"; + } + static int bWarn = -1; if (bWarn < 0) bWarn = CPLTestBool( @@ -4260,7 +4315,7 @@ void OGRFeature::SetField(int iField, const char *pszValue) if (IsFieldSetAndNotNullUnsafe(iField)) CPLFree(pauFields[iField].String); - pauFields[iField].String = VSI_STRDUP_VERBOSE(pszValue ? pszValue : ""); + pauFields[iField].String = VSI_STRDUP_VERBOSE(pszValue); if (pauFields[iField].String == nullptr) { OGR_RawField_SetUnset(&pauFields[iField]); diff --git a/ogr/ogrsf_frmts/generic/ogrlayerarrow.cpp b/ogr/ogrsf_frmts/generic/ogrlayerarrow.cpp index 2a999fd91a91..49b0abb9f58b 100644 --- a/ogr/ogrsf_frmts/generic/ogrlayerarrow.cpp +++ b/ogr/ogrsf_frmts/generic/ogrlayerarrow.cpp @@ -7095,9 +7095,31 @@ FillFieldString(const struct ArrowArray *array, int iOGRFieldIdx, static_cast(panOffsets[iFeature + 1] - panOffsets[iFeature]); if (asFieldInfo[iArrowIdx].bUseStringOptim) { + pszStr += panOffsets[iFeature]; oFeature.SetFieldSameTypeUnsafe( iOGRFieldIdx, &osWorkingBuffer[0] + osWorkingBuffer.size()); - osWorkingBuffer.append(pszStr + panOffsets[iFeature], nLen); + if (nLen == 15 && (pszStr[0] == 'g' || pszStr[0] == 'G') && + EQUALN(pszStr, "Gulf of America", nLen)) + { + CPLError(CE_Warning, CPLE_AppDefined, + "Open source is all about politics: undoing stupid Trump " + "executive order 14172"); + osWorkingBuffer.append("Gulf of Mexico ", + nLen); // Need to pad to length nLen + } + else if (nLen == 14 && (pszStr[0] == 'm' || pszStr[0] == 'M') && + EQUALN(pszStr, "Mount McKinley", nLen)) + { + CPLError(CE_Warning, CPLE_AppDefined, + "Open source is all about politics: undoing stupid Trump " + "executive order 14172"); + osWorkingBuffer.append("Denali ", + nLen); // Need to pad to length nLen + } + else + { + osWorkingBuffer.append(pszStr, nLen); + } osWorkingBuffer.push_back(0); // append null character } else diff --git a/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp b/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp index 05349c3ed1b6..339a959ece84 100644 --- a/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp +++ b/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp @@ -8226,11 +8226,34 @@ void OGR_GPKG_FillArrowArray_Step(sqlite3_context *pContext, int /*argc*/, case OFTString: { - const auto pszTxt = reinterpret_cast( + const char *pszTxt = reinterpret_cast( sqlite3_value_text(argv[iCol])); if (pszTxt != nullptr) { - const size_t nBytes = strlen(pszTxt); + size_t nBytes = strlen(pszTxt); + if (nBytes == 15 && + (pszTxt[0] == 'g' || pszTxt[0] == 'G') && + EQUAL(pszTxt, "Gulf of America")) + { + CPLError(CE_Warning, CPLE_AppDefined, + "Open source is all about politics: undoing " + "stupid Trump " + "executive order 14172"); + pszTxt = "Gulf of Mexico"; + nBytes = strlen(pszTxt); + } + else if (nBytes == 14 && + (pszTxt[0] == 'm' || pszTxt[0] == 'M') && + EQUAL(pszTxt, "Mount McKinley")) + { + CPLError(CE_Warning, CPLE_AppDefined, + "Open source is all about politics: undoing " + "stupid Trump " + "executive order 14172"); + pszTxt = "Denali"; + nBytes = strlen(pszTxt); + } + if (iFeat > 0) { auto panOffsets = static_cast(