pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Andrey Sokolov <a.sokolov@arenadata.io>
To: pgsql-hackers@lists.postgresql.org <pgsql-hackers@lists.postgresql.org>
Subject: [BUG] Storage declaration in ECPG
Date: Sun, 04 Sep 2022 13:49:53 +0300
Message-ID: <942241662288242@mail.yandex.ru> (raw)


------==--bound.774455.myt5-a5512e99e394.qloud-c.yandex.net
Content-Transfer-Encoding: 8bit
Content-Type: text/html; charset=utf-8

<div><div>Hi,</div><div> </div><div>The ECPG preprocessor converts the code</div><div>"static VARCHAR str1[10], str2[20], str3[30];"</div><div>into</div><div>"static  struct varchar_1  { int len; char arr[ 10 ]; }  str1 ;</div><div>         struct varchar_2  { int len; char arr[ 20 ]; }  str2 ;</div><div>         struct varchar_3  { int len; char arr[ 30 ]; }  str3 ;".</div><div>Storage declaration applies only to the first structure.</div><div> </div><div>The patch in the attachment fixes the bug. Storage declaration will be repeated before each structure.</div><div>The patch is on github too: https://github.com/andr-sokolov/postgresql/commit/c8f8fc7a211938569e7d46c91a428d8cb25b6f9c</div&g... Sokolov</div><div>Arenadata            https://arenadata.tech/</div></div;
------==--bound.774455.myt5-a5512e99e394.qloud-c.yandex.net
Content-Disposition: attachment;
	filename="0001-Fix-storage-declaration-in-ECPG.patch"
Content-Transfer-Encoding: base64
Content-Type: text/x-diff;
	name="0001-Fix-storage-declaration-in-ECPG.patch"

RnJvbSBjOGY4ZmM3YTIxMTkzODU2OWU3ZDQ2YzkxYTQyOGQ4Y2IyNWI2ZjljIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXkgU29rb2xvdiA8YS5zb2tvbG92QGFyZW5hZGF0YS5p
bz4KRGF0ZTogU3VuLCA0IFNlcCAyMDIyIDEyOjQ4OjIyICswMzAwClN1YmplY3Q6IFtQQVRDSF0g
Rml4IHN0b3JhZ2UgZGVjbGFyYXRpb24gaW4gRUNQRwoKVGhlIEVDUEcgcHJlcHJvY2Vzc29yIGNv
bnZlcnRlZCB0aGUgY29kZQoic3RhdGljIFZBUkNIQVIgc3RyMVsxMF0sIHN0cjJbMjBdLCBzdHIz
WzMwXTsiCmludG8KInN0YXRpYyAgc3RydWN0IHZhcmNoYXJfMSAgeyBpbnQgbGVuOyBjaGFyIGFy
clsgMTAgXTsgfSAgc3RyMSA7CiAgICAgICAgIHN0cnVjdCB2YXJjaGFyXzIgIHsgaW50IGxlbjsg
Y2hhciBhcnJbIDIwIF07IH0gIHN0cjIgOwogICAgICAgICBzdHJ1Y3QgdmFyY2hhcl8zICB7IGlu
dCBsZW47IGNoYXIgYXJyWyAzMCBdOyB9ICBzdHIzIDsiLgpTdG9yYWdlIGRlY2xhcmF0aW9uIGFw
cGxpZWQgb25seSB0byB0aGUgZmlyc3Qgc3RydWN0dXJlLgpOb3cgc3RvcmFnZSBkZWNsYXJhdGlv
biBpcyByZXBlYXRlZCBiZWZvcmUgZWFjaCBzdHJ1Y3R1cmUuCi0tLQogc3JjL2ludGVyZmFjZXMv
ZWNwZy9wcmVwcm9jL2VjcGcudHJhaWxlciAgICAgIHwgICA0ICstCiBzcmMvaW50ZXJmYWNlcy9l
Y3BnL3ByZXByb2MvdHlwZS5oICAgICAgICAgICAgfCAgIDEgKwogc3JjL2ludGVyZmFjZXMvZWNw
Zy90ZXN0L2VjcGdfc2NoZWR1bGUgICAgICAgIHwgICAxICsKIC4uLi90ZXN0L2V4cGVjdGVkL3By
ZXByb2Mtc3RhdGljX3ZhcmlhYmxlcy5jICB8IDE0NSArKysrKysrKysrKysrKysrKysKIC4uLi9l
eHBlY3RlZC9wcmVwcm9jLXN0YXRpY192YXJpYWJsZXMuc3RkZXJyICB8ICA5NiArKysrKysrKysr
KysKIC4uLi9leHBlY3RlZC9wcmVwcm9jLXN0YXRpY192YXJpYWJsZXMuc3Rkb3V0ICB8ICAgMyAr
CiBzcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvcHJlcHJvYy8uZ2l0aWdub3JlICAgfCAgIDIgKwog
c3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L3ByZXByb2MvTWFrZWZpbGUgICAgIHwgICAxICsKIC4u
Li9lY3BnL3Rlc3QvcHJlcHJvYy9zdGF0aWNfdmFyaWFibGVzLnBnYyAgICB8ICA1NSArKysrKysr
CiA5IGZpbGVzIGNoYW5nZWQsIDMwNyBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCiBjcmVh
dGUgbW9kZSAxMDA2NDQgc3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L2V4cGVjdGVkL3ByZXByb2Mt
c3RhdGljX3ZhcmlhYmxlcy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2ludGVyZmFjZXMvZWNw
Zy90ZXN0L2V4cGVjdGVkL3ByZXByb2Mtc3RhdGljX3ZhcmlhYmxlcy5zdGRlcnIKIGNyZWF0ZSBt
b2RlIDEwMDY0NCBzcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvZXhwZWN0ZWQvcHJlcHJvYy1zdGF0
aWNfdmFyaWFibGVzLnN0ZG91dAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9pbnRlcmZhY2VzL2Vj
cGcvdGVzdC9wcmVwcm9jL3N0YXRpY192YXJpYWJsZXMucGdjCgpkaWZmIC0tZ2l0IGEvc3JjL2lu
dGVyZmFjZXMvZWNwZy9wcmVwcm9jL2VjcGcudHJhaWxlciBiL3NyYy9pbnRlcmZhY2VzL2VjcGcv
cHJlcHJvYy9lY3BnLnRyYWlsZXIKaW5kZXggMGIxMDBiOWIwNC4uNTQyNTRlMmY5NyAxMDA2NDQK
LS0tIGEvc3JjL2ludGVyZmFjZXMvZWNwZy9wcmVwcm9jL2VjcGcudHJhaWxlcgorKysgYi9zcmMv
aW50ZXJmYWNlcy9lY3BnL3ByZXByb2MvZWNwZy50cmFpbGVyCkBAIC00NzksNiArNDc5LDcgQEAg
dHlwZV9kZWNsYXJhdGlvbjogU19UWVBFREVGCiB2YXJfZGVjbGFyYXRpb246IHN0b3JhZ2VfZGVj
bGFyYXRpb24KIAkJdmFyX3R5cGUKIAkJeworCQkJYWN0dWFsX3R5cGVbc3RydWN0X2xldmVsXS50
eXBlX3N0b3JhZ2UgPSAkMTsKIAkJCWFjdHVhbF90eXBlW3N0cnVjdF9sZXZlbF0udHlwZV9lbnVt
ID0gJDIudHlwZV9lbnVtOwogCQkJYWN0dWFsX3R5cGVbc3RydWN0X2xldmVsXS50eXBlX3N0ciA9
ICQyLnR5cGVfc3RyOwogCQkJYWN0dWFsX3R5cGVbc3RydWN0X2xldmVsXS50eXBlX2RpbWVuc2lv
biA9ICQyLnR5cGVfZGltZW5zaW9uOwpAQCAtNDkzLDYgKzQ5NCw3IEBAIHZhcl9kZWNsYXJhdGlv
bjogc3RvcmFnZV9kZWNsYXJhdGlvbgogCQl9CiAJCXwgdmFyX3R5cGUKIAkJeworCQkJYWN0dWFs
X3R5cGVbc3RydWN0X2xldmVsXS50eXBlX3N0b3JhZ2UgPSBFTVBUWTsKIAkJCWFjdHVhbF90eXBl
W3N0cnVjdF9sZXZlbF0udHlwZV9lbnVtID0gJDEudHlwZV9lbnVtOwogCQkJYWN0dWFsX3R5cGVb
c3RydWN0X2xldmVsXS50eXBlX3N0ciA9ICQxLnR5cGVfc3RyOwogCQkJYWN0dWFsX3R5cGVbc3Ry
dWN0X2xldmVsXS50eXBlX2RpbWVuc2lvbiA9ICQxLnR5cGVfZGltZW5zaW9uOwpAQCAtOTQ5LDcg
Kzk1MSw3IEBAIHZhcmlhYmxlX2xpc3Q6IHZhcmlhYmxlCiAJCXwgdmFyaWFibGVfbGlzdCAnLCcg
dmFyaWFibGUKIAkJewogCQkJaWYgKGFjdHVhbF90eXBlW3N0cnVjdF9sZXZlbF0udHlwZV9lbnVt
ID09IEVDUEd0X3ZhcmNoYXIgfHwgYWN0dWFsX3R5cGVbc3RydWN0X2xldmVsXS50eXBlX2VudW0g
PT0gRUNQR3RfYnl0ZWEpCi0JCQkJJCQgPSBjYXRfc3RyKDMsICQxLCBtbV9zdHJkdXAoIjsiKSwg
JDMpOworCQkJCSQkID0gY2F0X3N0cig0LCAkMSwgbW1fc3RyZHVwKCI7IiksIG1tX3N0cmR1cChh
Y3R1YWxfdHlwZVtzdHJ1Y3RfbGV2ZWxdLnR5cGVfc3RvcmFnZSksICQzKTsKIAkJCWVsc2UKIAkJ
CQkkJCA9IGNhdF9zdHIoMywgJDEsIG1tX3N0cmR1cCgiLCIpLCAkMyk7CiAJCX0KZGlmZiAtLWdp
dCBhL3NyYy9pbnRlcmZhY2VzL2VjcGcvcHJlcHJvYy90eXBlLmggYi9zcmMvaW50ZXJmYWNlcy9l
Y3BnL3ByZXByb2MvdHlwZS5oCmluZGV4IGZiMjBiZTUzZTAuLjA4YjczOWU1ZjMgMTAwNjQ0Ci0t
LSBhL3NyYy9pbnRlcmZhY2VzL2VjcGcvcHJlcHJvYy90eXBlLmgKKysrIGIvc3JjL2ludGVyZmFj
ZXMvZWNwZy9wcmVwcm9jL3R5cGUuaApAQCAtMTE0LDYgKzExNCw3IEBAIHN0cnVjdCBleGVjCiAK
IHN0cnVjdCB0aGlzX3R5cGUKIHsKKwljaGFyCSAgICp0eXBlX3N0b3JhZ2U7CiAJZW51bSBFQ1BH
dHR5cGUgdHlwZV9lbnVtOwogCWNoYXIJICAgKnR5cGVfc3RyOwogCWNoYXIJICAgKnR5cGVfZGlt
ZW5zaW9uOwpkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L2VjcGdfc2NoZWR1
bGUgYi9zcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvZWNwZ19zY2hlZHVsZQppbmRleCBlMDM0YzVh
NDIwLi5kNTk0YzRkOWIwIDEwMDY0NAotLS0gYS9zcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvZWNw
Z19zY2hlZHVsZQorKysgYi9zcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvZWNwZ19zY2hlZHVsZQpA
QCAtMjQsNiArMjQsNyBAQCB0ZXN0OiBwcmVwcm9jL2NvbW1lbnQKIHRlc3Q6IHByZXByb2MvY3Vy
c29yCiB0ZXN0OiBwcmVwcm9jL2RlZmluZQogdGVzdDogcHJlcHJvYy9pbml0Cit0ZXN0OiBwcmVw
cm9jL3N0YXRpY192YXJpYWJsZXMKIHRlc3Q6IHByZXByb2Mvc3RyaW5ncwogdGVzdDogcHJlcHJv
Yy90eXBlCiB0ZXN0OiBwcmVwcm9jL3ZhcmlhYmxlCmRpZmYgLS1naXQgYS9zcmMvaW50ZXJmYWNl
cy9lY3BnL3Rlc3QvZXhwZWN0ZWQvcHJlcHJvYy1zdGF0aWNfdmFyaWFibGVzLmMgYi9zcmMvaW50
ZXJmYWNlcy9lY3BnL3Rlc3QvZXhwZWN0ZWQvcHJlcHJvYy1zdGF0aWNfdmFyaWFibGVzLmMKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uYjBmNjJhOGIxNAotLS0gL2Rldi9u
dWxsCisrKyBiL3NyYy9pbnRlcmZhY2VzL2VjcGcvdGVzdC9leHBlY3RlZC9wcmVwcm9jLXN0YXRp
Y192YXJpYWJsZXMuYwpAQCAtMCwwICsxLDE0NSBAQAorLyogUHJvY2Vzc2VkIGJ5IGVjcGcgKHJl
Z3Jlc3Npb24gbW9kZSkgKi8KKy8qIFRoZXNlIGluY2x1ZGUgZmlsZXMgYXJlIGFkZGVkIGJ5IHRo
ZSBwcmVwcm9jZXNzb3IgKi8KKyNpbmNsdWRlIDxlY3BnbGliLmg+CisjaW5jbHVkZSA8ZWNwZ2Vy
cm5vLmg+CisjaW5jbHVkZSA8c3FsY2EuaD4KKy8qIEVuZCBvZiBhdXRvbWF0aWMgaW5jbHVkZSBz
ZWN0aW9uICovCisjZGVmaW5lIEVDUEdkZWJ1ZyhYLFkpIEVDUEdkZWJ1ZygoWCkrMTAwLChZKSkK
KworI2xpbmUgMSAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisjaW5jbHVkZSA8c3RkbGliLmg+CisK
KworI2xpbmUgMSAicmVncmVzc2lvbi5oIgorCisKKworCisKKworI2xpbmUgMyAic3RhdGljX3Zh
cmlhYmxlcy5wZ2MiCisKKworLyogZXhlYyBzcWwgd2hlbmV2ZXIgc3FsZXJyb3IgIHN0b3AgOyAq
LworI2xpbmUgNSAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisKKworLyogZGVjbGFyZSBjdXIgY3Vy
c29yIGZvciBzZWxlY3QgZmlyc3RuYW1lICwgbGFzdG5hbWUgLCBhZGRyZXNzIGZyb20gcGVyc29u
cyAqLworI2xpbmUgOCAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisKKworLyogZXhlYyBzcWwgYmVn
aW4gZGVjbGFyZSBzZWN0aW9uICovCisJICAgIAorCisjbGluZSAxMSAic3RhdGljX3ZhcmlhYmxl
cy5wZ2MiCisgc3RhdGljICBzdHJ1Y3QgdmFyY2hhcl8xICB7IGludCBsZW47IGNoYXIgYXJyWyA1
MCBdOyB9ICBmaXJzdG5hbWUgOyBzdGF0aWMgIHN0cnVjdCB2YXJjaGFyXzIgIHsgaW50IGxlbjsg
Y2hhciBhcnJbIDUwIF07IH0gIGxhc3RuYW1lIDsgc3RhdGljICBzdHJ1Y3QgdmFyY2hhcl8zICB7
IGludCBsZW47IGNoYXIgYXJyWyAyNTUgXTsgfSAgYWRkcmVzcyA7CisvKiBleGVjIHNxbCBlbmQg
ZGVjbGFyZSBzZWN0aW9uICovCisjbGluZSAxMiAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisKKwor
aW50CittYWluICh2b2lkKQoreworCWludCBsb29wY291bnQ7CisKKwlFQ1BHZGVidWcoMSwgc3Rk
ZXJyKTsKKworCXsgRUNQR2Nvbm5lY3QoX19MSU5FX18sIDAsICJlY3BnMV9yZWdyZXNzaW9uIiAs
IE5VTEwsIE5VTEwgLCBOVUxMLCAwKTsgCisjbGluZSAyMSAic3RhdGljX3ZhcmlhYmxlcy5wZ2Mi
CisKK2lmIChzcWxjYS5zcWxjb2RlIDwgMCkgZXhpdCAoMSk7fQorI2xpbmUgMjEgInN0YXRpY192
YXJpYWJsZXMucGdjIgorCisKKwl7IEVDUEdkbyhfX0xJTkVfXywgMCwgMSwgTlVMTCwgMCwgRUNQ
R3N0X25vcm1hbCwgImNyZWF0ZSB0YWJsZSBwZXJzb25zICggZmlyc3RuYW1lIHZhcmNoYXIgKCA1
MCApIG5vdCBudWxsICwgbGFzdG5hbWUgdmFyY2hhciAoIDUwICkgbm90IG51bGwgLCBhZGRyZXNz
IHZhcmNoYXIgKCAyNTUgKSBub3QgbnVsbCApIiwgRUNQR3RfRU9JVCwgRUNQR3RfRU9SVCk7Cisj
bGluZSAyNyAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisKK2lmIChzcWxjYS5zcWxjb2RlIDwgMCkg
ZXhpdCAoMSk7fQorI2xpbmUgMjcgInN0YXRpY192YXJpYWJsZXMucGdjIgorCisKKwl7IEVDUEdk
byhfX0xJTkVfXywgMCwgMSwgTlVMTCwgMCwgRUNQR3N0X25vcm1hbCwgImluc2VydCBpbnRvIHBl
cnNvbnMgKCBmaXJzdG5hbWUgLCBsYXN0bmFtZSAsIGFkZHJlc3MgKSB2YWx1ZXMgKCAnZmlyc3Ru
YW1lMScgLCAnbGFzdG5hbWUxJyAsICdhZGRyZXNzMScgKSIsIEVDUEd0X0VPSVQsIEVDUEd0X0VP
UlQpOworI2xpbmUgMzAgInN0YXRpY192YXJpYWJsZXMucGdjIgorCitpZiAoc3FsY2Euc3FsY29k
ZSA8IDApIGV4aXQgKDEpO30KKyNsaW5lIDMwICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKworCXsg
RUNQR2RvKF9fTElORV9fLCAwLCAxLCBOVUxMLCAwLCBFQ1BHc3Rfbm9ybWFsLCAiaW5zZXJ0IGlu
dG8gcGVyc29ucyAoIGZpcnN0bmFtZSAsIGxhc3RuYW1lICwgYWRkcmVzcyApIHZhbHVlcyAoICdm
aXJzdG5hbWUyJyAsICdsYXN0bmFtZTInICwgJ2FkZHJlc3MyJyApIiwgRUNQR3RfRU9JVCwgRUNQ
R3RfRU9SVCk7CisjbGluZSAzMiAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisKK2lmIChzcWxjYS5z
cWxjb2RlIDwgMCkgZXhpdCAoMSk7fQorI2xpbmUgMzIgInN0YXRpY192YXJpYWJsZXMucGdjIgor
CisJeyBFQ1BHZG8oX19MSU5FX18sIDAsIDEsIE5VTEwsIDAsIEVDUEdzdF9ub3JtYWwsICJpbnNl
cnQgaW50byBwZXJzb25zICggZmlyc3RuYW1lICwgbGFzdG5hbWUgLCBhZGRyZXNzICkgdmFsdWVz
ICggJ2ZpcnN0bmFtZTMnICwgJ2xhc3RuYW1lMycgLCAnYWRkcmVzczMnICkiLCBFQ1BHdF9FT0lU
LCBFQ1BHdF9FT1JUKTsKKyNsaW5lIDM0ICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKworaWYgKHNx
bGNhLnNxbGNvZGUgPCAwKSBleGl0ICgxKTt9CisjbGluZSAzNCAic3RhdGljX3ZhcmlhYmxlcy5w
Z2MiCisKKworCXsgRUNQR3RyYW5zKF9fTElORV9fLCBOVUxMLCAiY29tbWl0Iik7CisjbGluZSAz
NiAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisKK2lmIChzcWxjYS5zcWxjb2RlIDwgMCkgZXhpdCAo
MSk7fQorI2xpbmUgMzYgInN0YXRpY192YXJpYWJsZXMucGdjIgorCisKKwl7IEVDUEdkbyhfX0xJ
TkVfXywgMCwgMSwgTlVMTCwgMCwgRUNQR3N0X25vcm1hbCwgImRlY2xhcmUgY3VyIGN1cnNvciBm
b3Igc2VsZWN0IGZpcnN0bmFtZSAsIGxhc3RuYW1lICwgYWRkcmVzcyBmcm9tIHBlcnNvbnMiLCBF
Q1BHdF9FT0lULCBFQ1BHdF9FT1JUKTsKKyNsaW5lIDM4ICJzdGF0aWNfdmFyaWFibGVzLnBnYyIK
KworaWYgKHNxbGNhLnNxbGNvZGUgPCAwKSBleGl0ICgxKTt9CisjbGluZSAzOCAic3RhdGljX3Zh
cmlhYmxlcy5wZ2MiCisKKworCS8qIGV4ZWMgc3FsIHdoZW5ldmVyIG5vdCBmb3VuZCAgYnJlYWsg
OyAqLworI2xpbmUgNDAgInN0YXRpY192YXJpYWJsZXMucGdjIgorCisKKwlmb3IgKGxvb3Bjb3Vu
dCA9IDA7IGxvb3Bjb3VudCA8IDEwMDsgbG9vcGNvdW50KyspCisJeworCQl7IEVDUEdkbyhfX0xJ
TkVfXywgMCwgMSwgTlVMTCwgMCwgRUNQR3N0X25vcm1hbCwgImZldGNoIGN1ciIsIEVDUEd0X0VP
SVQsIAorCUVDUEd0X3ZhcmNoYXIsJihmaXJzdG5hbWUpLChsb25nKTUwLChsb25nKTEsc2l6ZW9m
KHN0cnVjdCB2YXJjaGFyXzEpLCAKKwlFQ1BHdF9OT19JTkRJQ0FUT1IsIE5VTEwgLCAwTCwgMEws
IDBMLCAKKwlFQ1BHdF92YXJjaGFyLCYobGFzdG5hbWUpLChsb25nKTUwLChsb25nKTEsc2l6ZW9m
KHN0cnVjdCB2YXJjaGFyXzIpLCAKKwlFQ1BHdF9OT19JTkRJQ0FUT1IsIE5VTEwgLCAwTCwgMEws
IDBMLCAKKwlFQ1BHdF92YXJjaGFyLCYoYWRkcmVzcyksKGxvbmcpMjU1LChsb25nKTEsc2l6ZW9m
KHN0cnVjdCB2YXJjaGFyXzMpLCAKKwlFQ1BHdF9OT19JTkRJQ0FUT1IsIE5VTEwgLCAwTCwgMEws
IDBMLCBFQ1BHdF9FT1JUKTsKKyNsaW5lIDQ0ICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKworaWYg
KHNxbGNhLnNxbGNvZGUgPT0gRUNQR19OT1RfRk9VTkQpIGJyZWFrOworI2xpbmUgNDQgInN0YXRp
Y192YXJpYWJsZXMucGdjIgorCitpZiAoc3FsY2Euc3FsY29kZSA8IDApIGV4aXQgKDEpO30KKyNs
aW5lIDQ0ICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKworCQlwcmludGYoIiUuKnNcdCUuKnNcdCUu
KnNcbiIsIGZpcnN0bmFtZS5sZW4sIGZpcnN0bmFtZS5hcnIsCisJCQkJCQkJCQkgbGFzdG5hbWUu
bGVuLCBsYXN0bmFtZS5hcnIsCisJCQkJCQkJCQkgYWRkcmVzcy5sZW4sIGFkZHJlc3MuYXJyKTsK
Kwl9CisKKwl7IEVDUEdkbyhfX0xJTkVfXywgMCwgMSwgTlVMTCwgMCwgRUNQR3N0X25vcm1hbCwg
ImNsb3NlIGN1ciIsIEVDUEd0X0VPSVQsIEVDUEd0X0VPUlQpOworI2xpbmUgNTAgInN0YXRpY192
YXJpYWJsZXMucGdjIgorCitpZiAoc3FsY2Euc3FsY29kZSA8IDApIGV4aXQgKDEpO30KKyNsaW5l
IDUwICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKworCXsgRUNQR2RvKF9fTElORV9fLCAwLCAxLCBO
VUxMLCAwLCBFQ1BHc3Rfbm9ybWFsLCAiZHJvcCB0YWJsZSBwZXJzb25zIiwgRUNQR3RfRU9JVCwg
RUNQR3RfRU9SVCk7CisjbGluZSA1MSAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisKK2lmIChzcWxj
YS5zcWxjb2RlIDwgMCkgZXhpdCAoMSk7fQorI2xpbmUgNTEgInN0YXRpY192YXJpYWJsZXMucGdj
IgorCisJeyBFQ1BHdHJhbnMoX19MSU5FX18sIE5VTEwsICJjb21taXQiKTsKKyNsaW5lIDUyICJz
dGF0aWNfdmFyaWFibGVzLnBnYyIKKworaWYgKHNxbGNhLnNxbGNvZGUgPCAwKSBleGl0ICgxKTt9
CisjbGluZSA1MiAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisKKwl7IEVDUEdkaXNjb25uZWN0KF9f
TElORV9fLCAiQ1VSUkVOVCIpOworI2xpbmUgNTMgInN0YXRpY192YXJpYWJsZXMucGdjIgorCitp
ZiAoc3FsY2Euc3FsY29kZSA8IDApIGV4aXQgKDEpO30KKyNsaW5lIDUzICJzdGF0aWNfdmFyaWFi
bGVzLnBnYyIKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMvZWNw
Zy90ZXN0L2V4cGVjdGVkL3ByZXByb2Mtc3RhdGljX3ZhcmlhYmxlcy5zdGRlcnIgYi9zcmMvaW50
ZXJmYWNlcy9lY3BnL3Rlc3QvZXhwZWN0ZWQvcHJlcHJvYy1zdGF0aWNfdmFyaWFibGVzLnN0ZGVy
cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi4wY2NmNzQwMjM4Ci0tLSAv
ZGV2L251bGwKKysrIGIvc3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L2V4cGVjdGVkL3ByZXByb2Mt
c3RhdGljX3ZhcmlhYmxlcy5zdGRlcnIKQEAgLTAsMCArMSw5NiBAQAorW05PX1BJRF06IEVDUEdk
ZWJ1Zzogc2V0IHRvIDEKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitb
Tk9fUElEXTogRUNQR2Nvbm5lY3Q6IG9wZW5pbmcgZGF0YWJhc2UgZWNwZzFfcmVncmVzc2lvbiBv
biA8REVGQVVMVD4gcG9ydCA8REVGQVVMVD4gIAorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBz
dGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2V4ZWN1dGUgb24gbGluZSAyMzogcXVlcnk6IGNy
ZWF0ZSB0YWJsZSBwZXJzb25zICggZmlyc3RuYW1lIHZhcmNoYXIgKCA1MCApIG5vdCBudWxsICwg
bGFzdG5hbWUgdmFyY2hhciAoIDUwICkgbm90IG51bGwgLCBhZGRyZXNzIHZhcmNoYXIgKCAyNTUg
KSBub3QgbnVsbCApOyB3aXRoIDAgcGFyYW1ldGVyKHMpIG9uIGNvbm5lY3Rpb24gZWNwZzFfcmVn
cmVzc2lvbgorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURd
OiBlY3BnX2V4ZWN1dGUgb24gbGluZSAyMzogdXNpbmcgUFFleGVjCitbTk9fUElEXTogc3FsY2E6
IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfcHJvY2Vzc19vdXRwdXQgb24g
bGluZSAyMzogT0s6IENSRUFURSBUQUJMRQorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0
ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2V4ZWN1dGUgb24gbGluZSAyOTogcXVlcnk6IGluc2Vy
dCBpbnRvIHBlcnNvbnMgKCBmaXJzdG5hbWUgLCBsYXN0bmFtZSAsIGFkZHJlc3MgKSB2YWx1ZXMg
KCAnZmlyc3RuYW1lMScgLCAnbGFzdG5hbWUxJyAsICdhZGRyZXNzMScgKTsgd2l0aCAwIHBhcmFt
ZXRlcihzKSBvbiBjb25uZWN0aW9uIGVjcGcxX3JlZ3Jlc3Npb24KK1tOT19QSURdOiBzcWxjYTog
Y29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19leGVjdXRlIG9uIGxpbmUgMjk6
IHVzaW5nIFBRZXhlYworW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tO
T19QSURdOiBlY3BnX3Byb2Nlc3Nfb3V0cHV0IG9uIGxpbmUgMjk6IE9LOiBJTlNFUlQgMCAxCitb
Tk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZXhl
Y3V0ZSBvbiBsaW5lIDMxOiBxdWVyeTogaW5zZXJ0IGludG8gcGVyc29ucyAoIGZpcnN0bmFtZSAs
IGxhc3RuYW1lICwgYWRkcmVzcyApIHZhbHVlcyAoICdmaXJzdG5hbWUyJyAsICdsYXN0bmFtZTIn
ICwgJ2FkZHJlc3MyJyApOyB3aXRoIDAgcGFyYW1ldGVyKHMpIG9uIGNvbm5lY3Rpb24gZWNwZzFf
cmVncmVzc2lvbgorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19Q
SURdOiBlY3BnX2V4ZWN1dGUgb24gbGluZSAzMTogdXNpbmcgUFFleGVjCitbTk9fUElEXTogc3Fs
Y2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfcHJvY2Vzc19vdXRwdXQg
b24gbGluZSAzMTogT0s6IElOU0VSVCAwIDEKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3Rh
dGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19leGVjdXRlIG9uIGxpbmUgMzM6IHF1ZXJ5OiBpbnNl
cnQgaW50byBwZXJzb25zICggZmlyc3RuYW1lICwgbGFzdG5hbWUgLCBhZGRyZXNzICkgdmFsdWVz
ICggJ2ZpcnN0bmFtZTMnICwgJ2xhc3RuYW1lMycgLCAnYWRkcmVzczMnICk7IHdpdGggMCBwYXJh
bWV0ZXIocykgb24gY29ubmVjdGlvbiBlY3BnMV9yZWdyZXNzaW9uCitbTk9fUElEXTogc3FsY2E6
IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZXhlY3V0ZSBvbiBsaW5lIDMz
OiB1c2luZyBQUWV4ZWMKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitb
Tk9fUElEXTogZWNwZ19wcm9jZXNzX291dHB1dCBvbiBsaW5lIDMzOiBPSzogSU5TRVJUIDAgMQor
W05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBFQ1BHdHJh
bnMgb24gbGluZSAzNjogYWN0aW9uICJjb21taXQiOyBjb25uZWN0aW9uICJlY3BnMV9yZWdyZXNz
aW9uIgorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBl
Y3BnX2V4ZWN1dGUgb24gbGluZSAzODogcXVlcnk6IGRlY2xhcmUgY3VyIGN1cnNvciBmb3Igc2Vs
ZWN0IGZpcnN0bmFtZSAsIGxhc3RuYW1lICwgYWRkcmVzcyBmcm9tIHBlcnNvbnM7IHdpdGggMCBw
YXJhbWV0ZXIocykgb24gY29ubmVjdGlvbiBlY3BnMV9yZWdyZXNzaW9uCitbTk9fUElEXTogc3Fs
Y2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZXhlY3V0ZSBvbiBsaW5l
IDM4OiB1c2luZyBQUWV4ZWMKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAw
CitbTk9fUElEXTogZWNwZ19wcm9jZXNzX291dHB1dCBvbiBsaW5lIDM4OiBPSzogREVDTEFSRSBD
VVJTT1IKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTog
ZWNwZ19leGVjdXRlIG9uIGxpbmUgNDQ6IHF1ZXJ5OiBmZXRjaCBjdXI7IHdpdGggMCBwYXJhbWV0
ZXIocykgb24gY29ubmVjdGlvbiBlY3BnMV9yZWdyZXNzaW9uCitbTk9fUElEXTogc3FsY2E6IGNv
ZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZXhlY3V0ZSBvbiBsaW5lIDQ0OiB1
c2luZyBQUWV4ZWMKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9f
UElEXTogZWNwZ19wcm9jZXNzX291dHB1dCBvbiBsaW5lIDQ0OiBjb3JyZWN0bHkgZ290IDEgdHVw
bGVzIHdpdGggMyBmaWVsZHMKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAw
CitbTk9fUElEXTogZWNwZ19nZXRfZGF0YSBvbiBsaW5lIDQ0OiBSRVNVTFQ6IGZpcnN0bmFtZTEg
b2Zmc2V0OiAtMTsgYXJyYXk6IG5vCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAw
MDAwMAorW05PX1BJRF06IGVjcGdfZ2V0X2RhdGEgb24gbGluZSA0NDogUkVTVUxUOiBsYXN0bmFt
ZTEgb2Zmc2V0OiAtMTsgYXJyYXk6IG5vCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRl
OiAwMDAwMAorW05PX1BJRF06IGVjcGdfZ2V0X2RhdGEgb24gbGluZSA0NDogUkVTVUxUOiBhZGRy
ZXNzMSBvZmZzZXQ6IC0xOyBhcnJheTogbm8KK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3Rh
dGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19leGVjdXRlIG9uIGxpbmUgNDQ6IHF1ZXJ5OiBmZXRj
aCBjdXI7IHdpdGggMCBwYXJhbWV0ZXIocykgb24gY29ubmVjdGlvbiBlY3BnMV9yZWdyZXNzaW9u
CitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdf
ZXhlY3V0ZSBvbiBsaW5lIDQ0OiB1c2luZyBQUWV4ZWMKK1tOT19QSURdOiBzcWxjYTogY29kZTog
MCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19wcm9jZXNzX291dHB1dCBvbiBsaW5lIDQ0
OiBjb3JyZWN0bHkgZ290IDEgdHVwbGVzIHdpdGggMyBmaWVsZHMKK1tOT19QSURdOiBzcWxjYTog
Y29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19nZXRfZGF0YSBvbiBsaW5lIDQ0
OiBSRVNVTFQ6IGZpcnN0bmFtZTIgb2Zmc2V0OiAtMTsgYXJyYXk6IG5vCitbTk9fUElEXTogc3Fs
Y2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZ2V0X2RhdGEgb24gbGlu
ZSA0NDogUkVTVUxUOiBsYXN0bmFtZTIgb2Zmc2V0OiAtMTsgYXJyYXk6IG5vCitbTk9fUElEXTog
c3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZ2V0X2RhdGEgb24g
bGluZSA0NDogUkVTVUxUOiBhZGRyZXNzMiBvZmZzZXQ6IC0xOyBhcnJheTogbm8KK1tOT19QSURd
OiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19leGVjdXRlIG9u
IGxpbmUgNDQ6IHF1ZXJ5OiBmZXRjaCBjdXI7IHdpdGggMCBwYXJhbWV0ZXIocykgb24gY29ubmVj
dGlvbiBlY3BnMV9yZWdyZXNzaW9uCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAw
MDAwMAorW05PX1BJRF06IGVjcGdfZXhlY3V0ZSBvbiBsaW5lIDQ0OiB1c2luZyBQUWV4ZWMKK1tO
T19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19wcm9j
ZXNzX291dHB1dCBvbiBsaW5lIDQ0OiBjb3JyZWN0bHkgZ290IDEgdHVwbGVzIHdpdGggMyBmaWVs
ZHMKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNw
Z19nZXRfZGF0YSBvbiBsaW5lIDQ0OiBSRVNVTFQ6IGZpcnN0bmFtZTMgb2Zmc2V0OiAtMTsgYXJy
YXk6IG5vCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06
IGVjcGdfZ2V0X2RhdGEgb24gbGluZSA0NDogUkVTVUxUOiBsYXN0bmFtZTMgb2Zmc2V0OiAtMTsg
YXJyYXk6IG5vCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJ
RF06IGVjcGdfZ2V0X2RhdGEgb24gbGluZSA0NDogUkVTVUxUOiBhZGRyZXNzMyBvZmZzZXQ6IC0x
OyBhcnJheTogbm8KK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9f
UElEXTogZWNwZ19leGVjdXRlIG9uIGxpbmUgNDQ6IHF1ZXJ5OiBmZXRjaCBjdXI7IHdpdGggMCBw
YXJhbWV0ZXIocykgb24gY29ubmVjdGlvbiBlY3BnMV9yZWdyZXNzaW9uCitbTk9fUElEXTogc3Fs
Y2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZXhlY3V0ZSBvbiBsaW5l
IDQ0OiB1c2luZyBQUWV4ZWMKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAw
CitbTk9fUElEXTogZWNwZ19wcm9jZXNzX291dHB1dCBvbiBsaW5lIDQ0OiBjb3JyZWN0bHkgZ290
IDAgdHVwbGVzIHdpdGggMyBmaWVsZHMKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6
IDAwMDAwCitbTk9fUElEXTogcmFpc2luZyBzcWxjb2RlIDEwMCBvbiBsaW5lIDQ0OiBubyBkYXRh
IGZvdW5kIG9uIGxpbmUgNDQKK1tOT19QSURdOiBzcWxjYTogY29kZTogMTAwLCBzdGF0ZTogMDIw
MDAKK1tOT19QSURdOiBlY3BnX2V4ZWN1dGUgb24gbGluZSA1MDogcXVlcnk6IGNsb3NlIGN1cjsg
d2l0aCAwIHBhcmFtZXRlcihzKSBvbiBjb25uZWN0aW9uIGVjcGcxX3JlZ3Jlc3Npb24KK1tOT19Q
SURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19leGVjdXRl
IG9uIGxpbmUgNTA6IHVzaW5nIFBRZXhlYworW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0
ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX3Byb2Nlc3Nfb3V0cHV0IG9uIGxpbmUgNTA6IE9LOiBD
TE9TRSBDVVJTT1IKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9f
UElEXTogZWNwZ19leGVjdXRlIG9uIGxpbmUgNTE6IHF1ZXJ5OiBkcm9wIHRhYmxlIHBlcnNvbnM7
IHdpdGggMCBwYXJhbWV0ZXIocykgb24gY29ubmVjdGlvbiBlY3BnMV9yZWdyZXNzaW9uCitbTk9f
UElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZXhlY3V0
ZSBvbiBsaW5lIDUxOiB1c2luZyBQUWV4ZWMKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3Rh
dGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19wcm9jZXNzX291dHB1dCBvbiBsaW5lIDUxOiBPSzog
RFJPUCBUQUJMRQorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19Q
SURdOiBFQ1BHdHJhbnMgb24gbGluZSA1MjogYWN0aW9uICJjb21taXQiOyBjb25uZWN0aW9uICJl
Y3BnMV9yZWdyZXNzaW9uIgorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAK
K1tOT19QSURdOiBlY3BnX2ZpbmlzaDogY29ubmVjdGlvbiBlY3BnMV9yZWdyZXNzaW9uIGNsb3Nl
ZAorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKZGlmZiAtLWdpdCBhL3Ny
Yy9pbnRlcmZhY2VzL2VjcGcvdGVzdC9leHBlY3RlZC9wcmVwcm9jLXN0YXRpY192YXJpYWJsZXMu
c3Rkb3V0IGIvc3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L2V4cGVjdGVkL3ByZXByb2Mtc3RhdGlj
X3ZhcmlhYmxlcy5zdGRvdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4u
MWMxNzY5NmQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pbnRlcmZhY2VzL2VjcGcvdGVzdC9l
eHBlY3RlZC9wcmVwcm9jLXN0YXRpY192YXJpYWJsZXMuc3Rkb3V0CkBAIC0wLDAgKzEsMyBAQAor
Zmlyc3RuYW1lMQlsYXN0bmFtZTEJYWRkcmVzczEKK2ZpcnN0bmFtZTIJbGFzdG5hbWUyCWFkZHJl
c3MyCitmaXJzdG5hbWUzCWxhc3RuYW1lMwlhZGRyZXNzMwpkaWZmIC0tZ2l0IGEvc3JjL2ludGVy
ZmFjZXMvZWNwZy90ZXN0L3ByZXByb2MvLmdpdGlnbm9yZSBiL3NyYy9pbnRlcmZhY2VzL2VjcGcv
dGVzdC9wcmVwcm9jLy5naXRpZ25vcmUKaW5kZXggZmQ2M2U2NDVhMy4uODMxYWNjYzUyNiAxMDA2
NDQKLS0tIGEvc3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L3ByZXByb2MvLmdpdGlnbm9yZQorKysg
Yi9zcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvcHJlcHJvYy8uZ2l0aWdub3JlCkBAIC0xNCw2ICsx
NCw4IEBACiAvb3V0b2ZzY29wZS5jCiAvcG9pbnRlcl90b19zdHJ1Y3QKIC9wb2ludGVyX3RvX3N0
cnVjdC5jCisvc3RhdGljX3ZhcmlhYmxlcworL3N0YXRpY192YXJpYWJsZXMuYwogL3N0cmluZ3MK
IC9zdHJpbmdzLmMKIC90eXBlCmRpZmYgLS1naXQgYS9zcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3Qv
cHJlcHJvYy9NYWtlZmlsZSBiL3NyYy9pbnRlcmZhY2VzL2VjcGcvdGVzdC9wcmVwcm9jL01ha2Vm
aWxlCmluZGV4IDM5YjE5NzRmNWYuLmEzY2ZlNjUzM2YgMTAwNjQ0Ci0tLSBhL3NyYy9pbnRlcmZh
Y2VzL2VjcGcvdGVzdC9wcmVwcm9jL01ha2VmaWxlCisrKyBiL3NyYy9pbnRlcmZhY2VzL2VjcGcv
dGVzdC9wcmVwcm9jL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBAIFRFU1RTID0gYXJyYXlfb2Zf
c3RydWN0IGFycmF5X29mX3N0cnVjdC5jIFwKIAljdXJzb3IgY3Vyc29yLmMgXAogCWRlZmluZSBk
ZWZpbmUuYyBcCiAJaW5pdCBpbml0LmMgXAorCXN0YXRpY192YXJpYWJsZXMgc3RhdGljX3Zhcmlh
Ymxlcy5jIFwKIAlzdHJpbmdzIHN0cmluZ3MuYyBcCiAJb3V0b2ZzY29wZSBvdXRvZnNjb3BlLmMg
XAogCXR5cGUgdHlwZS5jIFwKZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2VjcGcvdGVzdC9w
cmVwcm9jL3N0YXRpY192YXJpYWJsZXMucGdjIGIvc3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L3By
ZXByb2Mvc3RhdGljX3ZhcmlhYmxlcy5wZ2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMC4uNWMxZjczOGY0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pbnRlcmZhY2VzL2Vj
cGcvdGVzdC9wcmVwcm9jL3N0YXRpY192YXJpYWJsZXMucGdjCkBAIC0wLDAgKzEsNTUgQEAKKyNp
bmNsdWRlIDxzdGRsaWIuaD4KKworZXhlYyBzcWwgaW5jbHVkZSAuLi9yZWdyZXNzaW9uOworCitl
eGVjIHNxbCB3aGVuZXZlciBzcWxlcnJvciBzdG9wOworCitleGVjIHNxbCBkZWNsYXJlIGN1ciBj
dXJzb3IgZm9yCisJc2VsZWN0IGZpcnN0bmFtZSwgbGFzdG5hbWUsIGFkZHJlc3MgZnJvbSBwZXJz
b25zOworCitleGVjIHNxbCBiZWdpbiBkZWNsYXJlIHNlY3Rpb247CisJc3RhdGljIHZhcmNoYXIg
Zmlyc3RuYW1lWzUwXSwgbGFzdG5hbWVbNTBdLCBhZGRyZXNzWzI1NV07CitleGVjIHNxbCBlbmQg
ZGVjbGFyZSBzZWN0aW9uOworCitpbnQKK21haW4gKHZvaWQpCit7CisJaW50IGxvb3Bjb3VudDsK
KworCUVDUEdkZWJ1ZygxLCBzdGRlcnIpOworCisJZXhlYyBzcWwgY29ubmVjdCB0byBSRUdSRVNT
REIxOworCisJZXhlYyBzcWwgY3JlYXRlIHRhYmxlIHBlcnNvbnMgKAorCQlmaXJzdG5hbWUgdmFy
Y2hhcig1MCkgbm90IG51bGwsCisJCWxhc3RuYW1lIHZhcmNoYXIoNTApIG5vdCBudWxsLAorCQlh
ZGRyZXNzIHZhcmNoYXIoMjU1KSBub3QgbnVsbAorCSk7CisKKwlleGVjIHNxbCBpbnNlcnQgaW50
byBwZXJzb25zIChmaXJzdG5hbWUsIGxhc3RuYW1lLCBhZGRyZXNzKQorCQkJIHZhbHVlcyAoJ2Zp
cnN0bmFtZTEnLCAnbGFzdG5hbWUxJywgJ2FkZHJlc3MxJyk7CisJZXhlYyBzcWwgaW5zZXJ0IGlu
dG8gcGVyc29ucyAoZmlyc3RuYW1lLCBsYXN0bmFtZSwgYWRkcmVzcykKKwkJCSB2YWx1ZXMgKCdm
aXJzdG5hbWUyJywgJ2xhc3RuYW1lMicsICdhZGRyZXNzMicpOworCWV4ZWMgc3FsIGluc2VydCBp
bnRvIHBlcnNvbnMgKGZpcnN0bmFtZSwgbGFzdG5hbWUsIGFkZHJlc3MpCisJCQkgdmFsdWVzICgn
Zmlyc3RuYW1lMycsICdsYXN0bmFtZTMnLCAnYWRkcmVzczMnKTsKKworCWV4ZWMgc3FsIGNvbW1p
dDsKKworCWV4ZWMgc3FsIG9wZW4gY3VyOworCisJZXhlYyBzcWwgd2hlbmV2ZXIgbm90IGZvdW5k
IGRvIGJyZWFrOworCisJZm9yIChsb29wY291bnQgPSAwOyBsb29wY291bnQgPCAxMDA7IGxvb3Bj
b3VudCsrKQorCXsKKwkJZXhlYyBzcWwgZmV0Y2ggY3VyIGludG8gOmZpcnN0bmFtZSwgOmxhc3Ru
YW1lLCA6YWRkcmVzczsKKwkJcHJpbnRmKCIlLipzXHQlLipzXHQlLipzXG4iLCBmaXJzdG5hbWUu
bGVuLCBmaXJzdG5hbWUuYXJyLAorCQkJCQkJCQkJIGxhc3RuYW1lLmxlbiwgbGFzdG5hbWUuYXJy
LAorCQkJCQkJCQkJIGFkZHJlc3MubGVuLCBhZGRyZXNzLmFycik7CisJfQorCisJZXhlYyBzcWwg
Y2xvc2UgY3VyOworCWV4ZWMgc3FsIGRyb3AgdGFibGUgcGVyc29uczsKKwlleGVjIHNxbCBjb21t
aXQ7CisJZXhlYyBzcWwgZGlzY29ubmVjdDsKKwlyZXR1cm4gMDsKK30KLS0gCjIuMzMuMwoK
------==--bound.774455.myt5-a5512e99e394.qloud-c.yandex.net--





Attachments:

  [text/x-diff] 0001-Fix-storage-declaration-in-ECPG.patch (16.9K, ../942241662288242@mail.yandex.ru/2-0001-Fix-storage-declaration-in-ECPG.patch)
  download | inline diff:
From c8f8fc7a211938569e7d46c91a428d8cb25b6f9c Mon Sep 17 00:00:00 2001
From: Andrey Sokolov <a.sokolov@arenadata.io>
Date: Sun, 4 Sep 2022 12:48:22 +0300
Subject: [PATCH] Fix storage declaration in ECPG

The ECPG preprocessor converted the code
"static VARCHAR str1[10], str2[20], str3[30];"
into
"static  struct varchar_1  { int len; char arr[ 10 ]; }  str1 ;
         struct varchar_2  { int len; char arr[ 20 ]; }  str2 ;
         struct varchar_3  { int len; char arr[ 30 ]; }  str3 ;".
Storage declaration applied only to the first structure.
Now storage declaration is repeated before each structure.
---
 src/interfaces/ecpg/preproc/ecpg.trailer      |   4 +-
 src/interfaces/ecpg/preproc/type.h            |   1 +
 src/interfaces/ecpg/test/ecpg_schedule        |   1 +
 .../test/expected/preproc-static_variables.c  | 145 ++++++++++++++++++
 .../expected/preproc-static_variables.stderr  |  96 ++++++++++++
 .../expected/preproc-static_variables.stdout  |   3 +
 src/interfaces/ecpg/test/preproc/.gitignore   |   2 +
 src/interfaces/ecpg/test/preproc/Makefile     |   1 +
 .../ecpg/test/preproc/static_variables.pgc    |  55 +++++++
 9 files changed, 307 insertions(+), 1 deletion(-)
 create mode 100644 src/interfaces/ecpg/test/expected/preproc-static_variables.c
 create mode 100644 src/interfaces/ecpg/test/expected/preproc-static_variables.stderr
 create mode 100644 src/interfaces/ecpg/test/expected/preproc-static_variables.stdout
 create mode 100644 src/interfaces/ecpg/test/preproc/static_variables.pgc

diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer
index 0b100b9b04..54254e2f97 100644
--- a/src/interfaces/ecpg/preproc/ecpg.trailer
+++ b/src/interfaces/ecpg/preproc/ecpg.trailer
@@ -479,6 +479,7 @@ type_declaration: S_TYPEDEF
 var_declaration: storage_declaration
 		var_type
 		{
+			actual_type[struct_level].type_storage = $1;
 			actual_type[struct_level].type_enum = $2.type_enum;
 			actual_type[struct_level].type_str = $2.type_str;
 			actual_type[struct_level].type_dimension = $2.type_dimension;
@@ -493,6 +494,7 @@ var_declaration: storage_declaration
 		}
 		| var_type
 		{
+			actual_type[struct_level].type_storage = EMPTY;
 			actual_type[struct_level].type_enum = $1.type_enum;
 			actual_type[struct_level].type_str = $1.type_str;
 			actual_type[struct_level].type_dimension = $1.type_dimension;
@@ -949,7 +951,7 @@ variable_list: variable
 		| variable_list ',' variable
 		{
 			if (actual_type[struct_level].type_enum == ECPGt_varchar || actual_type[struct_level].type_enum == ECPGt_bytea)
-				$$ = cat_str(3, $1, mm_strdup(";"), $3);
+				$$ = cat_str(4, $1, mm_strdup(";"), mm_strdup(actual_type[struct_level].type_storage), $3);
 			else
 				$$ = cat_str(3, $1, mm_strdup(","), $3);
 		}
diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h
index fb20be53e0..08b739e5f3 100644
--- a/src/interfaces/ecpg/preproc/type.h
+++ b/src/interfaces/ecpg/preproc/type.h
@@ -114,6 +114,7 @@ struct exec
 
 struct this_type
 {
+	char	   *type_storage;
 	enum ECPGttype type_enum;
 	char	   *type_str;
 	char	   *type_dimension;
diff --git a/src/interfaces/ecpg/test/ecpg_schedule b/src/interfaces/ecpg/test/ecpg_schedule
index e034c5a420..d594c4d9b0 100644
--- a/src/interfaces/ecpg/test/ecpg_schedule
+++ b/src/interfaces/ecpg/test/ecpg_schedule
@@ -24,6 +24,7 @@ test: preproc/comment
 test: preproc/cursor
 test: preproc/define
 test: preproc/init
+test: preproc/static_variables
 test: preproc/strings
 test: preproc/type
 test: preproc/variable
diff --git a/src/interfaces/ecpg/test/expected/preproc-static_variables.c b/src/interfaces/ecpg/test/expected/preproc-static_variables.c
new file mode 100644
index 0000000000..b0f62a8b14
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/preproc-static_variables.c
@@ -0,0 +1,145 @@
+/* Processed by ecpg (regression mode) */
+/* These include files are added by the preprocessor */
+#include <ecpglib.h>
+#include <ecpgerrno.h>
+#include <sqlca.h>
+/* End of automatic include section */
+#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
+
+#line 1 "static_variables.pgc"
+#include <stdlib.h>
+
+
+#line 1 "regression.h"
+
+
+
+
+
+
+#line 3 "static_variables.pgc"
+
+
+/* exec sql whenever sqlerror  stop ; */
+#line 5 "static_variables.pgc"
+
+
+/* declare cur cursor for select firstname , lastname , address from persons */
+#line 8 "static_variables.pgc"
+
+
+/* exec sql begin declare section */
+	    
+
+#line 11 "static_variables.pgc"
+ static  struct varchar_1  { int len; char arr[ 50 ]; }  firstname ; static  struct varchar_2  { int len; char arr[ 50 ]; }  lastname ; static  struct varchar_3  { int len; char arr[ 255 ]; }  address ;
+/* exec sql end declare section */
+#line 12 "static_variables.pgc"
+
+
+int
+main (void)
+{
+	int loopcount;
+
+	ECPGdebug(1, stderr);
+
+	{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); 
+#line 21 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 21 "static_variables.pgc"
+
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table persons ( firstname varchar ( 50 ) not null , lastname varchar ( 50 ) not null , address varchar ( 255 ) not null )", ECPGt_EOIT, ECPGt_EORT);
+#line 27 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 27 "static_variables.pgc"
+
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into persons ( firstname , lastname , address ) values ( 'firstname1' , 'lastname1' , 'address1' )", ECPGt_EOIT, ECPGt_EORT);
+#line 30 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 30 "static_variables.pgc"
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into persons ( firstname , lastname , address ) values ( 'firstname2' , 'lastname2' , 'address2' )", ECPGt_EOIT, ECPGt_EORT);
+#line 32 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 32 "static_variables.pgc"
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into persons ( firstname , lastname , address ) values ( 'firstname3' , 'lastname3' , 'address3' )", ECPGt_EOIT, ECPGt_EORT);
+#line 34 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 34 "static_variables.pgc"
+
+
+	{ ECPGtrans(__LINE__, NULL, "commit");
+#line 36 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 36 "static_variables.pgc"
+
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select firstname , lastname , address from persons", ECPGt_EOIT, ECPGt_EORT);
+#line 38 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 38 "static_variables.pgc"
+
+
+	/* exec sql whenever not found  break ; */
+#line 40 "static_variables.pgc"
+
+
+	for (loopcount = 0; loopcount < 100; loopcount++)
+	{
+		{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch cur", ECPGt_EOIT, 
+	ECPGt_varchar,&(firstname),(long)50,(long)1,sizeof(struct varchar_1), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_varchar,&(lastname),(long)50,(long)1,sizeof(struct varchar_2), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_varchar,&(address),(long)255,(long)1,sizeof(struct varchar_3), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 44 "static_variables.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 44 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 44 "static_variables.pgc"
+
+		printf("%.*s\t%.*s\t%.*s\n", firstname.len, firstname.arr,
+									 lastname.len, lastname.arr,
+									 address.len, address.arr);
+	}
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+#line 50 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 50 "static_variables.pgc"
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table persons", ECPGt_EOIT, ECPGt_EORT);
+#line 51 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 51 "static_variables.pgc"
+
+	{ ECPGtrans(__LINE__, NULL, "commit");
+#line 52 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 52 "static_variables.pgc"
+
+	{ ECPGdisconnect(__LINE__, "CURRENT");
+#line 53 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 53 "static_variables.pgc"
+
+	return 0;
+}
diff --git a/src/interfaces/ecpg/test/expected/preproc-static_variables.stderr b/src/interfaces/ecpg/test/expected/preproc-static_variables.stderr
new file mode 100644
index 0000000000..0ccf740238
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/preproc-static_variables.stderr
@@ -0,0 +1,96 @@
+[NO_PID]: ECPGdebug: set to 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGconnect: opening database ecpg1_regression on <DEFAULT> port <DEFAULT>  
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 23: query: create table persons ( firstname varchar ( 50 ) not null , lastname varchar ( 50 ) not null , address varchar ( 255 ) not null ); with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 23: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 23: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 29: query: insert into persons ( firstname , lastname , address ) values ( 'firstname1' , 'lastname1' , 'address1' ); with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 29: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 29: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 31: query: insert into persons ( firstname , lastname , address ) values ( 'firstname2' , 'lastname2' , 'address2' ); with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 31: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 31: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 33: query: insert into persons ( firstname , lastname , address ) values ( 'firstname3' , 'lastname3' , 'address3' ); with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 33: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 33: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 36: action "commit"; connection "ecpg1_regression"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 38: query: declare cur cursor for select firstname , lastname , address from persons; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 38: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 38: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 44: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 44: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 44: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 44: RESULT: firstname1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 44: RESULT: lastname1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 44: RESULT: address1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 44: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 44: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 44: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 44: RESULT: firstname2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 44: RESULT: lastname2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 44: RESULT: address2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 44: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 44: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 44: correctly got 1 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 44: RESULT: firstname3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 44: RESULT: lastname3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 44: RESULT: address3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 44: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 44: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 44: correctly got 0 tuples with 3 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 44: no data found on line 44
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 50: query: close cur; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 50: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 50: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 51: query: drop table persons; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 51: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 51: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 52: action "commit"; connection "ecpg1_regression"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_finish: connection ecpg1_regression closed
+[NO_PID]: sqlca: code: 0, state: 00000
diff --git a/src/interfaces/ecpg/test/expected/preproc-static_variables.stdout b/src/interfaces/ecpg/test/expected/preproc-static_variables.stdout
new file mode 100644
index 0000000000..1c17696d46
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/preproc-static_variables.stdout
@@ -0,0 +1,3 @@
+firstname1	lastname1	address1
+firstname2	lastname2	address2
+firstname3	lastname3	address3
diff --git a/src/interfaces/ecpg/test/preproc/.gitignore b/src/interfaces/ecpg/test/preproc/.gitignore
index fd63e645a3..831accc526 100644
--- a/src/interfaces/ecpg/test/preproc/.gitignore
+++ b/src/interfaces/ecpg/test/preproc/.gitignore
@@ -14,6 +14,8 @@
 /outofscope.c
 /pointer_to_struct
 /pointer_to_struct.c
+/static_variables
+/static_variables.c
 /strings
 /strings.c
 /type
diff --git a/src/interfaces/ecpg/test/preproc/Makefile b/src/interfaces/ecpg/test/preproc/Makefile
index 39b1974f5f..a3cfe6533f 100644
--- a/src/interfaces/ecpg/test/preproc/Makefile
+++ b/src/interfaces/ecpg/test/preproc/Makefile
@@ -10,6 +10,7 @@ TESTS = array_of_struct array_of_struct.c \
 	cursor cursor.c \
 	define define.c \
 	init init.c \
+	static_variables static_variables.c \
 	strings strings.c \
 	outofscope outofscope.c \
 	type type.c \
diff --git a/src/interfaces/ecpg/test/preproc/static_variables.pgc b/src/interfaces/ecpg/test/preproc/static_variables.pgc
new file mode 100644
index 0000000000..5c1f738f45
--- /dev/null
+++ b/src/interfaces/ecpg/test/preproc/static_variables.pgc
@@ -0,0 +1,55 @@
+#include <stdlib.h>
+
+exec sql include ../regression;
+
+exec sql whenever sqlerror stop;
+
+exec sql declare cur cursor for
+	select firstname, lastname, address from persons;
+
+exec sql begin declare section;
+	static varchar firstname[50], lastname[50], address[255];
+exec sql end declare section;
+
+int
+main (void)
+{
+	int loopcount;
+
+	ECPGdebug(1, stderr);
+
+	exec sql connect to REGRESSDB1;
+
+	exec sql create table persons (
+		firstname varchar(50) not null,
+		lastname varchar(50) not null,
+		address varchar(255) not null
+	);
+
+	exec sql insert into persons (firstname, lastname, address)
+			 values ('firstname1', 'lastname1', 'address1');
+	exec sql insert into persons (firstname, lastname, address)
+			 values ('firstname2', 'lastname2', 'address2');
+	exec sql insert into persons (firstname, lastname, address)
+			 values ('firstname3', 'lastname3', 'address3');
+
+	exec sql commit;
+
+	exec sql open cur;
+
+	exec sql whenever not found do break;
+
+	for (loopcount = 0; loopcount < 100; loopcount++)
+	{
+		exec sql fetch cur into :firstname, :lastname, :address;
+		printf("%.*s\t%.*s\t%.*s\n", firstname.len, firstname.arr,
+									 lastname.len, lastname.arr,
+									 address.len, address.arr);
+	}
+
+	exec sql close cur;
+	exec sql drop table persons;
+	exec sql commit;
+	exec sql disconnect;
+	return 0;
+}
-- 
2.33.3



view thread (4+ messages)  latest in thread

Message-ID: <942241662288242@mail.yandex.ru>
Permalink:  ../942241662288242@mail.yandex.ru/
Also on:    postgresql.org/message-id/942241662288242@mail.yandex.ru

 ·  · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-hackers@postgresql.org
  Cc: a.sokolov@arenadata.io, pgsql-hackers@lists.postgresql.org
  Subject: Re: [BUG] Storage declaration in ECPG
  In-Reply-To: <942241662288242@mail.yandex.ru>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox