pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
[BUG] Storage declaration in ECPG
4+ messages / 3 participants
[nested] [flat]

* [BUG] Storage declaration in ECPG
@ 2022-09-04 10:49 Andrey Sokolov <a.sokolov@arenadata.io>
  2022-09-05 08:12 ` Re: [BUG] Storage declaration in ECPG Kyotaro Horiguchi <horikyota.ntt@gmail.com>
  0 siblings, 1 reply; 4+ messages in thread

From: Andrey Sokolov @ 2022-09-04 10:49 UTC (permalink / raw)
  To: pgsql-hackers@lists.postgresql.org <pgsql-hackers@lists.postgresql.org>


------==--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



^ permalink  raw  reply  [nested|flat] 4+ messages in thread

* Re: [BUG] Storage declaration in ECPG
  2022-09-04 10:49 [BUG] Storage declaration in ECPG Andrey Sokolov <a.sokolov@arenadata.io>
@ 2022-09-05 08:12 ` Kyotaro Horiguchi <horikyota.ntt@gmail.com>
  2022-09-07 20:57   ` Re: [BUG] Storage declaration in ECPG Andrey Sokolov <a.sokolov@arenadata.io>
  0 siblings, 1 reply; 4+ messages in thread

From: Kyotaro Horiguchi @ 2022-09-05 08:12 UTC (permalink / raw)
  To: a.sokolov@arenadata.io; +Cc: pgsql-hackers@lists.postgresql.org

At Sun, 04 Sep 2022 13:49:53 +0300, Andrey Sokolov <a.sokolov@arenadata.io> wrote in 
> Hi,
> 
> The ECPG preprocessor converts 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 applies only to the first structure.

Good catch!

> The patch in the attachment fixes the bug. Storage declaration will be
> repeated before each structure.
> The patch is on github too:
> https://github.com/andr-sokolov/postgresql/commit/c8f8fc7a211938569e7d46c91a428d8cb25b6f9c

And the code looks good to me.

About the test, don't we need the test for non-varchar/bytea static
variables like "static int inta, intb, intc;"?

regards.

-- 
Kyotaro Horiguchi
NTT Open Source Software Center





^ permalink  raw  reply  [nested|flat] 4+ messages in thread

* Re: [BUG] Storage declaration in ECPG
  2022-09-04 10:49 [BUG] Storage declaration in ECPG Andrey Sokolov <a.sokolov@arenadata.io>
  2022-09-05 08:12 ` Re: [BUG] Storage declaration in ECPG Kyotaro Horiguchi <horikyota.ntt@gmail.com>
@ 2022-09-07 20:57   ` Andrey Sokolov <a.sokolov@arenadata.io>
  2022-09-09 19:36     ` Re: [BUG] Storage declaration in ECPG Tom Lane <tgl@sss.pgh.pa.us>
  0 siblings, 1 reply; 4+ messages in thread

From: Andrey Sokolov @ 2022-09-07 20:57 UTC (permalink / raw)
  To: Kyotaro Horiguchi <horikyota.ntt@gmail.com>; +Cc: pgsql-hackers@lists.postgresql.org <pgsql-hackers@lists.postgresql.org>


------==--bound.212839.iva6-d8ca7b1d7b79.qloud-c.yandex.net
Content-Transfer-Encoding: 8bit
Content-Type: text/html; charset=utf-8

<div>05.09.2022, 11:12, "Kyotaro Horiguchi" &lt;horikyota.ntt@gmail.com&gt;:</div><blockquote> <p>About the test, don't we need the test for non-varchar/bytea static<br />variables like "static int inta, intb, intc;"?</p></blockquote><div>Good idea, thanks. I have added tests for static int and bytea. The new patch is in the attachment and here https://github.com/andr-sokolov/postgresql/commit/5a4adc1b5a2a0adfc152debcaf825e7a95a47450</div;
------==--bound.212839.iva6-d8ca7b1d7b79.qloud-c.yandex.net
Content-Disposition: attachment;
	filename="v2-0001-Fix-storage-declaration-in-ECPG.patch"
Content-Transfer-Encoding: base64
Content-Type: text/x-diff;
	name="v2-0001-Fix-storage-declaration-in-ECPG.patch"

RnJvbSA1YTRhZGMxYjVhMmEwYWRmYzE1MmRlYmNhZjgyNWU3YTk1YTQ3NDUwIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXkgU29rb2xvdiA8YS5zb2tvbG92QGFyZW5hZGF0YS5p
bz4KRGF0ZTogU3VuLCA0IFNlcCAyMDIyIDEyOjQ4OjIyICswMzAwClN1YmplY3Q6IFtQQVRDSCB2
Ml0gRml4IHN0b3JhZ2UgZGVjbGFyYXRpb24gaW4gRUNQRwoKVGhlIEVDUEcgcHJlcHJvY2Vzc29y
IGNvbnZlcnRlZCB0aGUgY29kZQoic3RhdGljIFZBUkNIQVIgc3RyMVsxMF0sIHN0cjJbMjBdLCBz
dHIzWzMwXTsiCmludG8KInN0YXRpYyAgc3RydWN0IHZhcmNoYXJfMSAgeyBpbnQgbGVuOyBjaGFy
IGFyclsgMTAgXTsgfSAgc3RyMSA7CiAgICAgICAgIHN0cnVjdCB2YXJjaGFyXzIgIHsgaW50IGxl
bjsgY2hhciBhcnJbIDIwIF07IH0gIHN0cjIgOwogICAgICAgICBzdHJ1Y3QgdmFyY2hhcl8zICB7
IGludCBsZW47IGNoYXIgYXJyWyAzMCBdOyB9ICBzdHIzIDsiLgpTdG9yYWdlIGRlY2xhcmF0aW9u
IGFwcGxpZWQgb25seSB0byB0aGUgZmlyc3Qgc3RydWN0dXJlLgpOb3cgc3RvcmFnZSBkZWNsYXJh
dGlvbiBpcyByZXBlYXRlZCBiZWZvcmUgZWFjaCBzdHJ1Y3R1cmUuCi0tLQogc3JjL2ludGVyZmFj
ZXMvZWNwZy9wcmVwcm9jL2VjcGcudHJhaWxlciAgICAgIHwgICA0ICstCiBzcmMvaW50ZXJmYWNl
cy9lY3BnL3ByZXByb2MvdHlwZS5oICAgICAgICAgICAgfCAgIDEgKwogc3JjL2ludGVyZmFjZXMv
ZWNwZy90ZXN0L2VjcGdfc2NoZWR1bGUgICAgICAgIHwgICAxICsKIC4uLi90ZXN0L2V4cGVjdGVk
L3ByZXByb2Mtc3RhdGljX3ZhcmlhYmxlcy5jICB8IDIxNSArKysrKysrKysrKysrKysrKysKIC4u
Li9leHBlY3RlZC9wcmVwcm9jLXN0YXRpY192YXJpYWJsZXMuc3RkZXJyICB8IDE1MCArKysrKysr
KysrKysKIC4uLi9leHBlY3RlZC9wcmVwcm9jLXN0YXRpY192YXJpYWJsZXMuc3Rkb3V0ICB8ICAx
MiArCiBzcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvcHJlcHJvYy8uZ2l0aWdub3JlICAgfCAgIDIg
Kwogc3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L3ByZXByb2MvTWFrZWZpbGUgICAgIHwgICAxICsK
IC4uLi9lY3BnL3Rlc3QvcHJlcHJvYy9zdGF0aWNfdmFyaWFibGVzLnBnYyAgICB8IDExOCArKysr
KysrKysrCiA5IGZpbGVzIGNoYW5nZWQsIDUwMyBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0p
CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L2V4cGVjdGVkL3By
ZXByb2Mtc3RhdGljX3ZhcmlhYmxlcy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2ludGVyZmFj
ZXMvZWNwZy90ZXN0L2V4cGVjdGVkL3ByZXByb2Mtc3RhdGljX3ZhcmlhYmxlcy5zdGRlcnIKIGNy
ZWF0ZSBtb2RlIDEwMDY0NCBzcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvZXhwZWN0ZWQvcHJlcHJv
Yy1zdGF0aWNfdmFyaWFibGVzLnN0ZG91dAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9pbnRlcmZh
Y2VzL2VjcGcvdGVzdC9wcmVwcm9jL3N0YXRpY192YXJpYWJsZXMucGdjCgpkaWZmIC0tZ2l0IGEv
c3JjL2ludGVyZmFjZXMvZWNwZy9wcmVwcm9jL2VjcGcudHJhaWxlciBiL3NyYy9pbnRlcmZhY2Vz
L2VjcGcvcHJlcHJvYy9lY3BnLnRyYWlsZXIKaW5kZXggMGIxMDBiOWIwNC4uNTQyNTRlMmY5NyAx
MDA2NDQKLS0tIGEvc3JjL2ludGVyZmFjZXMvZWNwZy9wcmVwcm9jL2VjcGcudHJhaWxlcgorKysg
Yi9zcmMvaW50ZXJmYWNlcy9lY3BnL3ByZXByb2MvZWNwZy50cmFpbGVyCkBAIC00NzksNiArNDc5
LDcgQEAgdHlwZV9kZWNsYXJhdGlvbjogU19UWVBFREVGCiB2YXJfZGVjbGFyYXRpb246IHN0b3Jh
Z2VfZGVjbGFyYXRpb24KIAkJdmFyX3R5cGUKIAkJeworCQkJYWN0dWFsX3R5cGVbc3RydWN0X2xl
dmVsXS50eXBlX3N0b3JhZ2UgPSAkMTsKIAkJCWFjdHVhbF90eXBlW3N0cnVjdF9sZXZlbF0udHlw
ZV9lbnVtID0gJDIudHlwZV9lbnVtOwogCQkJYWN0dWFsX3R5cGVbc3RydWN0X2xldmVsXS50eXBl
X3N0ciA9ICQyLnR5cGVfc3RyOwogCQkJYWN0dWFsX3R5cGVbc3RydWN0X2xldmVsXS50eXBlX2Rp
bWVuc2lvbiA9ICQyLnR5cGVfZGltZW5zaW9uOwpAQCAtNDkzLDYgKzQ5NCw3IEBAIHZhcl9kZWNs
YXJhdGlvbjogc3RvcmFnZV9kZWNsYXJhdGlvbgogCQl9CiAJCXwgdmFyX3R5cGUKIAkJeworCQkJ
YWN0dWFsX3R5cGVbc3RydWN0X2xldmVsXS50eXBlX3N0b3JhZ2UgPSBFTVBUWTsKIAkJCWFjdHVh
bF90eXBlW3N0cnVjdF9sZXZlbF0udHlwZV9lbnVtID0gJDEudHlwZV9lbnVtOwogCQkJYWN0dWFs
X3R5cGVbc3RydWN0X2xldmVsXS50eXBlX3N0ciA9ICQxLnR5cGVfc3RyOwogCQkJYWN0dWFsX3R5
cGVbc3RydWN0X2xldmVsXS50eXBlX2RpbWVuc2lvbiA9ICQxLnR5cGVfZGltZW5zaW9uOwpAQCAt
OTQ5LDcgKzk1MSw3IEBAIHZhcmlhYmxlX2xpc3Q6IHZhcmlhYmxlCiAJCXwgdmFyaWFibGVfbGlz
dCAnLCcgdmFyaWFibGUKIAkJewogCQkJaWYgKGFjdHVhbF90eXBlW3N0cnVjdF9sZXZlbF0udHlw
ZV9lbnVtID09IEVDUEd0X3ZhcmNoYXIgfHwgYWN0dWFsX3R5cGVbc3RydWN0X2xldmVsXS50eXBl
X2VudW0gPT0gRUNQR3RfYnl0ZWEpCi0JCQkJJCQgPSBjYXRfc3RyKDMsICQxLCBtbV9zdHJkdXAo
IjsiKSwgJDMpOworCQkJCSQkID0gY2F0X3N0cig0LCAkMSwgbW1fc3RyZHVwKCI7IiksIG1tX3N0
cmR1cChhY3R1YWxfdHlwZVtzdHJ1Y3RfbGV2ZWxdLnR5cGVfc3RvcmFnZSksICQzKTsKIAkJCWVs
c2UKIAkJCQkkJCA9IGNhdF9zdHIoMywgJDEsIG1tX3N0cmR1cCgiLCIpLCAkMyk7CiAJCX0KZGlm
ZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2VjcGcvcHJlcHJvYy90eXBlLmggYi9zcmMvaW50ZXJm
YWNlcy9lY3BnL3ByZXByb2MvdHlwZS5oCmluZGV4IGZiMjBiZTUzZTAuLjA4YjczOWU1ZjMgMTAw
NjQ0Ci0tLSBhL3NyYy9pbnRlcmZhY2VzL2VjcGcvcHJlcHJvYy90eXBlLmgKKysrIGIvc3JjL2lu
dGVyZmFjZXMvZWNwZy9wcmVwcm9jL3R5cGUuaApAQCAtMTE0LDYgKzExNCw3IEBAIHN0cnVjdCBl
eGVjCiAKIHN0cnVjdCB0aGlzX3R5cGUKIHsKKwljaGFyCSAgICp0eXBlX3N0b3JhZ2U7CiAJZW51
bSBFQ1BHdHR5cGUgdHlwZV9lbnVtOwogCWNoYXIJICAgKnR5cGVfc3RyOwogCWNoYXIJICAgKnR5
cGVfZGltZW5zaW9uOwpkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L2VjcGdf
c2NoZWR1bGUgYi9zcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvZWNwZ19zY2hlZHVsZQppbmRleCBl
MDM0YzVhNDIwLi5kNTk0YzRkOWIwIDEwMDY0NAotLS0gYS9zcmMvaW50ZXJmYWNlcy9lY3BnL3Rl
c3QvZWNwZ19zY2hlZHVsZQorKysgYi9zcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvZWNwZ19zY2hl
ZHVsZQpAQCAtMjQsNiArMjQsNyBAQCB0ZXN0OiBwcmVwcm9jL2NvbW1lbnQKIHRlc3Q6IHByZXBy
b2MvY3Vyc29yCiB0ZXN0OiBwcmVwcm9jL2RlZmluZQogdGVzdDogcHJlcHJvYy9pbml0Cit0ZXN0
OiBwcmVwcm9jL3N0YXRpY192YXJpYWJsZXMKIHRlc3Q6IHByZXByb2Mvc3RyaW5ncwogdGVzdDog
cHJlcHJvYy90eXBlCiB0ZXN0OiBwcmVwcm9jL3ZhcmlhYmxlCmRpZmYgLS1naXQgYS9zcmMvaW50
ZXJmYWNlcy9lY3BnL3Rlc3QvZXhwZWN0ZWQvcHJlcHJvYy1zdGF0aWNfdmFyaWFibGVzLmMgYi9z
cmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvZXhwZWN0ZWQvcHJlcHJvYy1zdGF0aWNfdmFyaWFibGVz
LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uNWE2YmNlZTY2NgotLS0g
L2Rldi9udWxsCisrKyBiL3NyYy9pbnRlcmZhY2VzL2VjcGcvdGVzdC9leHBlY3RlZC9wcmVwcm9j
LXN0YXRpY192YXJpYWJsZXMuYwpAQCAtMCwwICsxLDIxNSBAQAorLyogUHJvY2Vzc2VkIGJ5IGVj
cGcgKHJlZ3Jlc3Npb24gbW9kZSkgKi8KKy8qIFRoZXNlIGluY2x1ZGUgZmlsZXMgYXJlIGFkZGVk
IGJ5IHRoZSBwcmVwcm9jZXNzb3IgKi8KKyNpbmNsdWRlIDxlY3BnbGliLmg+CisjaW5jbHVkZSA8
ZWNwZ2Vycm5vLmg+CisjaW5jbHVkZSA8c3FsY2EuaD4KKy8qIEVuZCBvZiBhdXRvbWF0aWMgaW5j
bHVkZSBzZWN0aW9uICovCisjZGVmaW5lIEVDUEdkZWJ1ZyhYLFkpIEVDUEdkZWJ1ZygoWCkrMTAw
LChZKSkKKworI2xpbmUgMSAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisjaW5jbHVkZSA8c3RkbGli
Lmg+CisKKworI2xpbmUgMSAicmVncmVzc2lvbi5oIgorCisKKworCisKKworI2xpbmUgMyAic3Rh
dGljX3ZhcmlhYmxlcy5wZ2MiCisKKworLyogZXhlYyBzcWwgd2hlbmV2ZXIgc3FsZXJyb3IgIHN0
b3AgOyAqLworI2xpbmUgNSAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisKKworLyogZGVjbGFyZSBj
dXIgY3Vyc29yIGZvciBzZWxlY3QgZmlyc3RuYW1lICwgbGFzdG5hbWUgLCBhZGRyZXNzICwgeWVh
cl9vZl9iaXJ0aCAsIGhlaWdodF9pbl9zbSAsIHdlaWdodF9pbl9rZyAsIGRhdGExICwgZGF0YTIg
LCBkYXRhMyBmcm9tIHBlcnNvbnMgKi8KKyNsaW5lIDExICJzdGF0aWNfdmFyaWFibGVzLnBnYyIK
KworCisvKiBleGVjIHNxbCBiZWdpbiBkZWNsYXJlIHNlY3Rpb24gKi8KKwkgICAgCisJICAgIAor
CSAgICAgICAgCisJCQkJICAgIAorCisjbGluZSAxNCAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisg
c3RhdGljICBzdHJ1Y3QgdmFyY2hhcl8xICB7IGludCBsZW47IGNoYXIgYXJyWyA1MCBdOyB9ICBm
aXJzdG5hbWUgOyBzdGF0aWMgIHN0cnVjdCB2YXJjaGFyXzIgIHsgaW50IGxlbjsgY2hhciBhcnJb
IDUwIF07IH0gIGxhc3RuYW1lIDsgc3RhdGljICBzdHJ1Y3QgdmFyY2hhcl8zICB7IGludCBsZW47
IGNoYXIgYXJyWyAyNTUgXTsgfSAgYWRkcmVzcyA7CisgCisjbGluZSAxNSAic3RhdGljX3Zhcmlh
Ymxlcy5wZ2MiCisgc3RhdGljIGludCB5ZWFyX29mX2JpcnRoICwgaGVpZ2h0X2luX3NtICwgd2Vp
Z2h0X2luX2tnIDsKKyAKKyNsaW5lIDE2ICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKyBzdGF0aWMg
IHN0cnVjdCBieXRlYV8xICB7IGludCBsZW47IGNoYXIgYXJyWyA1IF07IH0gIGRhdGExIDsgc3Rh
dGljICBzdHJ1Y3QgYnl0ZWFfMiAgeyBpbnQgbGVuOyBjaGFyIGFyclsgOCBdOyB9ICBkYXRhMiA7
IHN0YXRpYyAgc3RydWN0IGJ5dGVhXzMgIHsgaW50IGxlbjsgY2hhciBhcnJbIDEyIF07IH0gIGRh
dGEzIDsgc3RhdGljICBzdHJ1Y3QgYnl0ZWFfNCAgeyBpbnQgbGVuOyBjaGFyIGFyclsgNSBdOyB9
ICBkYXRhMV8yIDsgc3RhdGljICBzdHJ1Y3QgYnl0ZWFfNSAgeyBpbnQgbGVuOyBjaGFyIGFyclsg
OCBdOyB9ICBkYXRhMl8yIDsgc3RhdGljICBzdHJ1Y3QgYnl0ZWFfNiAgeyBpbnQgbGVuOyBjaGFy
IGFyclsgMTIgXTsgfSAgZGF0YTNfMiA7CisvKiBleGVjIHNxbCBlbmQgZGVjbGFyZSBzZWN0aW9u
ICovCisjbGluZSAxOCAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisKKworc3RhdGljIHZvaWQKK2R1
bXBfYmluYXJ5KGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCXByaW50ZigibGVu
PSVkLCBkYXRhPTB4IiwgbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCXByaW50
ZigiJTAyeCIsIGJ1ZltpXSk7CisJcHJpbnRmKCJcbiIpOworfQorCitpbnQKK21haW4gKHZvaWQp
Cit7CisJaW50IGxvb3Bjb3VudDsKKworCUVDUEdkZWJ1ZygxLCBzdGRlcnIpOworCisJeyBFQ1BH
Y29ubmVjdChfX0xJTkVfXywgMCwgImVjcGcxX3JlZ3Jlc3Npb24iICwgTlVMTCwgTlVMTCAsIE5V
TEwsIDApOyAKKyNsaW5lIDM4ICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKworaWYgKHNxbGNhLnNx
bGNvZGUgPCAwKSBleGl0ICgxKTt9CisjbGluZSAzOCAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisK
KworCXsgRUNQR2RvKF9fTElORV9fLCAwLCAxLCBOVUxMLCAwLCBFQ1BHc3Rfbm9ybWFsLCAiY3Jl
YXRlIHRhYmxlIHBlcnNvbnMgKCBmaXJzdG5hbWUgdmFyY2hhciAoIDUwICkgbm90IG51bGwgLCBs
YXN0bmFtZSB2YXJjaGFyICggNTAgKSBub3QgbnVsbCAsIGFkZHJlc3MgdmFyY2hhciAoIDI1NSAp
IG5vdCBudWxsICwgeWVhcl9vZl9iaXJ0aCBpbnQgbm90IG51bGwgLCBoZWlnaHRfaW5fc20gaW50
IG5vdCBudWxsICwgd2VpZ2h0X2luX2tnIGludCBub3QgbnVsbCAsIGRhdGExIGJ5dGVhIG5vdCBu
dWxsICwgZGF0YTIgYnl0ZWEgbm90IG51bGwgLCBkYXRhMyBieXRlYSBub3QgbnVsbCApIiwgRUNQ
R3RfRU9JVCwgRUNQR3RfRU9SVCk7CisjbGluZSA1MCAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisK
K2lmIChzcWxjYS5zcWxjb2RlIDwgMCkgZXhpdCAoMSk7fQorI2xpbmUgNTAgInN0YXRpY192YXJp
YWJsZXMucGdjIgorCisKKwlkYXRhMS5sZW4gPSA1OworCWZvciAobG9vcGNvdW50ID0gMDsgbG9v
cGNvdW50IDwgZGF0YTEubGVuOyBsb29wY291bnQrKykKKwkJZGF0YTEuYXJyW2xvb3Bjb3VudF0g
PSAxOworCisJZGF0YTIubGVuID0gODsKKwlmb3IgKGxvb3Bjb3VudCA9IDA7IGxvb3Bjb3VudCA8
IGRhdGEyLmxlbjsgbG9vcGNvdW50KyspCisJCWRhdGEyLmFycltsb29wY291bnRdID0gMjsKKwor
CWRhdGEzLmxlbiA9IDEyOworCWZvciAobG9vcGNvdW50ID0gMDsgbG9vcGNvdW50IDwgZGF0YTMu
bGVuOyBsb29wY291bnQrKykKKwkJZGF0YTMuYXJyW2xvb3Bjb3VudF0gPSAzOworCisJeyBFQ1BH
ZG8oX19MSU5FX18sIDAsIDEsIE5VTEwsIDAsIEVDUEdzdF9ub3JtYWwsICJpbnNlcnQgaW50byBw
ZXJzb25zICggZmlyc3RuYW1lICwgbGFzdG5hbWUgLCBhZGRyZXNzICwgeWVhcl9vZl9iaXJ0aCAs
IGhlaWdodF9pbl9zbSAsIHdlaWdodF9pbl9rZyAsIGRhdGExICwgZGF0YTIgLCBkYXRhMyApIHZh
bHVlcyAoICdmaXJzdG5hbWUxJyAsICdsYXN0bmFtZTEnICwgJ2FkZHJlc3MxJyAsIDE5ODUgLCAx
ODAgLCA3MCAsICQxICAsICQyICAsICQzICApIiwgCisJRUNQR3RfYnl0ZWEsJihkYXRhMSksKGxv
bmcpNSwobG9uZykxLHNpemVvZihzdHJ1Y3QgYnl0ZWFfMSksIAorCUVDUEd0X05PX0lORElDQVRP
UiwgTlVMTCAsIDBMLCAwTCwgMEwsIAorCUVDUEd0X2J5dGVhLCYoZGF0YTIpLChsb25nKTgsKGxv
bmcpMSxzaXplb2Yoc3RydWN0IGJ5dGVhXzIpLCAKKwlFQ1BHdF9OT19JTkRJQ0FUT1IsIE5VTEwg
LCAwTCwgMEwsIDBMLCAKKwlFQ1BHdF9ieXRlYSwmKGRhdGEzKSwobG9uZykxMiwobG9uZykxLHNp
emVvZihzdHJ1Y3QgYnl0ZWFfMyksIAorCUVDUEd0X05PX0lORElDQVRPUiwgTlVMTCAsIDBMLCAw
TCwgMEwsIEVDUEd0X0VPSVQsIEVDUEd0X0VPUlQpOworI2xpbmUgNzEgInN0YXRpY192YXJpYWJs
ZXMucGdjIgorCitpZiAoc3FsY2Euc3FsY29kZSA8IDApIGV4aXQgKDEpO30KKyNsaW5lIDcxICJz
dGF0aWNfdmFyaWFibGVzLnBnYyIKKworCisJeyBFQ1BHZG8oX19MSU5FX18sIDAsIDEsIE5VTEws
IDAsIEVDUEdzdF9ub3JtYWwsICJpbnNlcnQgaW50byBwZXJzb25zICggZmlyc3RuYW1lICwgbGFz
dG5hbWUgLCBhZGRyZXNzICwgeWVhcl9vZl9iaXJ0aCAsIGhlaWdodF9pbl9zbSAsIHdlaWdodF9p
bl9rZyAsIGRhdGExICwgZGF0YTIgLCBkYXRhMyApIHZhbHVlcyAoICdmaXJzdG5hbWUyJyAsICds
YXN0bmFtZTInICwgJ2FkZHJlc3MyJyAsIDE5OTUgLCAxNzAgLCA2NSAsICQxICAsICQyICAsICQz
ICApIiwgCisJRUNQR3RfYnl0ZWEsJihkYXRhMSksKGxvbmcpNSwobG9uZykxLHNpemVvZihzdHJ1
Y3QgYnl0ZWFfMSksIAorCUVDUEd0X05PX0lORElDQVRPUiwgTlVMTCAsIDBMLCAwTCwgMEwsIAor
CUVDUEd0X2J5dGVhLCYoZGF0YTIpLChsb25nKTgsKGxvbmcpMSxzaXplb2Yoc3RydWN0IGJ5dGVh
XzIpLCAKKwlFQ1BHdF9OT19JTkRJQ0FUT1IsIE5VTEwgLCAwTCwgMEwsIDBMLCAKKwlFQ1BHdF9i
eXRlYSwmKGRhdGEzKSwobG9uZykxMiwobG9uZykxLHNpemVvZihzdHJ1Y3QgYnl0ZWFfMyksIAor
CUVDUEd0X05PX0lORElDQVRPUiwgTlVMTCAsIDBMLCAwTCwgMEwsIEVDUEd0X0VPSVQsIEVDUEd0
X0VPUlQpOworI2xpbmUgODAgInN0YXRpY192YXJpYWJsZXMucGdjIgorCitpZiAoc3FsY2Euc3Fs
Y29kZSA8IDApIGV4aXQgKDEpO30KKyNsaW5lIDgwICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKwor
CisJeyBFQ1BHZG8oX19MSU5FX18sIDAsIDEsIE5VTEwsIDAsIEVDUEdzdF9ub3JtYWwsICJpbnNl
cnQgaW50byBwZXJzb25zICggZmlyc3RuYW1lICwgbGFzdG5hbWUgLCBhZGRyZXNzICwgeWVhcl9v
Zl9iaXJ0aCAsIGhlaWdodF9pbl9zbSAsIHdlaWdodF9pbl9rZyAsIGRhdGExICwgZGF0YTIgLCBk
YXRhMyApIHZhbHVlcyAoICdmaXJzdG5hbWUzJyAsICdsYXN0bmFtZTMnICwgJ2FkZHJlc3MzJyAs
IDIwMDAgLCAxNzIgLCA4MCAsICQxICAsICQyICAsICQzICApIiwgCisJRUNQR3RfYnl0ZWEsJihk
YXRhMSksKGxvbmcpNSwobG9uZykxLHNpemVvZihzdHJ1Y3QgYnl0ZWFfMSksIAorCUVDUEd0X05P
X0lORElDQVRPUiwgTlVMTCAsIDBMLCAwTCwgMEwsIAorCUVDUEd0X2J5dGVhLCYoZGF0YTIpLChs
b25nKTgsKGxvbmcpMSxzaXplb2Yoc3RydWN0IGJ5dGVhXzIpLCAKKwlFQ1BHdF9OT19JTkRJQ0FU
T1IsIE5VTEwgLCAwTCwgMEwsIDBMLCAKKwlFQ1BHdF9ieXRlYSwmKGRhdGEzKSwobG9uZykxMiwo
bG9uZykxLHNpemVvZihzdHJ1Y3QgYnl0ZWFfMyksIAorCUVDUEd0X05PX0lORElDQVRPUiwgTlVM
TCAsIDBMLCAwTCwgMEwsIEVDUEd0X0VPSVQsIEVDUEd0X0VPUlQpOworI2xpbmUgODkgInN0YXRp
Y192YXJpYWJsZXMucGdjIgorCitpZiAoc3FsY2Euc3FsY29kZSA8IDApIGV4aXQgKDEpO30KKyNs
aW5lIDg5ICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKworCisJeyBFQ1BHdHJhbnMoX19MSU5FX18s
IE5VTEwsICJjb21taXQiKTsKKyNsaW5lIDkxICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKworaWYg
KHNxbGNhLnNxbGNvZGUgPCAwKSBleGl0ICgxKTt9CisjbGluZSA5MSAic3RhdGljX3ZhcmlhYmxl
cy5wZ2MiCisKKworCXsgRUNQR2RvKF9fTElORV9fLCAwLCAxLCBOVUxMLCAwLCBFQ1BHc3Rfbm9y
bWFsLCAiZGVjbGFyZSBjdXIgY3Vyc29yIGZvciBzZWxlY3QgZmlyc3RuYW1lICwgbGFzdG5hbWUg
LCBhZGRyZXNzICwgeWVhcl9vZl9iaXJ0aCAsIGhlaWdodF9pbl9zbSAsIHdlaWdodF9pbl9rZyAs
IGRhdGExICwgZGF0YTIgLCBkYXRhMyBmcm9tIHBlcnNvbnMiLCBFQ1BHdF9FT0lULCBFQ1BHdF9F
T1JUKTsKKyNsaW5lIDkzICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKworaWYgKHNxbGNhLnNxbGNv
ZGUgPCAwKSBleGl0ICgxKTt9CisjbGluZSA5MyAic3RhdGljX3ZhcmlhYmxlcy5wZ2MiCisKKwor
CS8qIGV4ZWMgc3FsIHdoZW5ldmVyIG5vdCBmb3VuZCAgYnJlYWsgOyAqLworI2xpbmUgOTUgInN0
YXRpY192YXJpYWJsZXMucGdjIgorCisKKwlmb3IgKGxvb3Bjb3VudCA9IDA7IGxvb3Bjb3VudCA8
IDEwMDsgbG9vcGNvdW50KyspCisJeworCQl7IEVDUEdkbyhfX0xJTkVfXywgMCwgMSwgTlVMTCwg
MCwgRUNQR3N0X25vcm1hbCwgImZldGNoIGN1ciIsIEVDUEd0X0VPSVQsIAorCUVDUEd0X3ZhcmNo
YXIsJihmaXJzdG5hbWUpLChsb25nKTUwLChsb25nKTEsc2l6ZW9mKHN0cnVjdCB2YXJjaGFyXzEp
LCAKKwlFQ1BHdF9OT19JTkRJQ0FUT1IsIE5VTEwgLCAwTCwgMEwsIDBMLCAKKwlFQ1BHdF92YXJj
aGFyLCYobGFzdG5hbWUpLChsb25nKTUwLChsb25nKTEsc2l6ZW9mKHN0cnVjdCB2YXJjaGFyXzIp
LCAKKwlFQ1BHdF9OT19JTkRJQ0FUT1IsIE5VTEwgLCAwTCwgMEwsIDBMLCAKKwlFQ1BHdF92YXJj
aGFyLCYoYWRkcmVzcyksKGxvbmcpMjU1LChsb25nKTEsc2l6ZW9mKHN0cnVjdCB2YXJjaGFyXzMp
LCAKKwlFQ1BHdF9OT19JTkRJQ0FUT1IsIE5VTEwgLCAwTCwgMEwsIDBMLCAKKwlFQ1BHdF9pbnQs
Jih5ZWFyX29mX2JpcnRoKSwobG9uZykxLChsb25nKTEsc2l6ZW9mKGludCksIAorCUVDUEd0X05P
X0lORElDQVRPUiwgTlVMTCAsIDBMLCAwTCwgMEwsIAorCUVDUEd0X2ludCwmKGhlaWdodF9pbl9z
bSksKGxvbmcpMSwobG9uZykxLHNpemVvZihpbnQpLCAKKwlFQ1BHdF9OT19JTkRJQ0FUT1IsIE5V
TEwgLCAwTCwgMEwsIDBMLCAKKwlFQ1BHdF9pbnQsJih3ZWlnaHRfaW5fa2cpLChsb25nKTEsKGxv
bmcpMSxzaXplb2YoaW50KSwgCisJRUNQR3RfTk9fSU5ESUNBVE9SLCBOVUxMICwgMEwsIDBMLCAw
TCwgCisJRUNQR3RfYnl0ZWEsJihkYXRhMV8yKSwobG9uZyk1LChsb25nKTEsc2l6ZW9mKHN0cnVj
dCBieXRlYV80KSwgCisJRUNQR3RfTk9fSU5ESUNBVE9SLCBOVUxMICwgMEwsIDBMLCAwTCwgCisJ
RUNQR3RfYnl0ZWEsJihkYXRhMl8yKSwobG9uZyk4LChsb25nKTEsc2l6ZW9mKHN0cnVjdCBieXRl
YV81KSwgCisJRUNQR3RfTk9fSU5ESUNBVE9SLCBOVUxMICwgMEwsIDBMLCAwTCwgCisJRUNQR3Rf
Ynl0ZWEsJihkYXRhM18yKSwobG9uZykxMiwobG9uZykxLHNpemVvZihzdHJ1Y3QgYnl0ZWFfNiks
IAorCUVDUEd0X05PX0lORElDQVRPUiwgTlVMTCAsIDBMLCAwTCwgMEwsIEVDUEd0X0VPUlQpOwor
I2xpbmUgMTAxICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKworaWYgKHNxbGNhLnNxbGNvZGUgPT0g
RUNQR19OT1RfRk9VTkQpIGJyZWFrOworI2xpbmUgMTAxICJzdGF0aWNfdmFyaWFibGVzLnBnYyIK
KworaWYgKHNxbGNhLnNxbGNvZGUgPCAwKSBleGl0ICgxKTt9CisjbGluZSAxMDEgInN0YXRpY192
YXJpYWJsZXMucGdjIgorCisKKwkJcHJpbnRmKCIlLipzXHQlLipzXHQlLipzXHQlaVx0JWlcdCVp
XG4iLAorCQkJZmlyc3RuYW1lLmxlbiwgZmlyc3RuYW1lLmFyciwKKwkJCWxhc3RuYW1lLmxlbiwg
bGFzdG5hbWUuYXJyLAorCQkJYWRkcmVzcy5sZW4sIGFkZHJlc3MuYXJyLAorCQkJeWVhcl9vZl9i
aXJ0aCwgaGVpZ2h0X2luX3NtLCB3ZWlnaHRfaW5fa2cpOworCQlkdW1wX2JpbmFyeShkYXRhMV8y
LmFyciwgZGF0YTFfMi5sZW4pOworCQlkdW1wX2JpbmFyeShkYXRhMl8yLmFyciwgZGF0YTJfMi5s
ZW4pOworCQlkdW1wX2JpbmFyeShkYXRhM18yLmFyciwgZGF0YTNfMi5sZW4pOworCX0KKworCXsg
RUNQR2RvKF9fTElORV9fLCAwLCAxLCBOVUxMLCAwLCBFQ1BHc3Rfbm9ybWFsLCAiY2xvc2UgY3Vy
IiwgRUNQR3RfRU9JVCwgRUNQR3RfRU9SVCk7CisjbGluZSAxMTMgInN0YXRpY192YXJpYWJsZXMu
cGdjIgorCitpZiAoc3FsY2Euc3FsY29kZSA8IDApIGV4aXQgKDEpO30KKyNsaW5lIDExMyAic3Rh
dGljX3ZhcmlhYmxlcy5wZ2MiCisKKwl7IEVDUEdkbyhfX0xJTkVfXywgMCwgMSwgTlVMTCwgMCwg
RUNQR3N0X25vcm1hbCwgImRyb3AgdGFibGUgcGVyc29ucyIsIEVDUEd0X0VPSVQsIEVDUEd0X0VP
UlQpOworI2xpbmUgMTE0ICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKworaWYgKHNxbGNhLnNxbGNv
ZGUgPCAwKSBleGl0ICgxKTt9CisjbGluZSAxMTQgInN0YXRpY192YXJpYWJsZXMucGdjIgorCisJ
eyBFQ1BHdHJhbnMoX19MSU5FX18sIE5VTEwsICJjb21taXQiKTsKKyNsaW5lIDExNSAic3RhdGlj
X3ZhcmlhYmxlcy5wZ2MiCisKK2lmIChzcWxjYS5zcWxjb2RlIDwgMCkgZXhpdCAoMSk7fQorI2xp
bmUgMTE1ICJzdGF0aWNfdmFyaWFibGVzLnBnYyIKKworCXsgRUNQR2Rpc2Nvbm5lY3QoX19MSU5F
X18sICJDVVJSRU5UIik7CisjbGluZSAxMTYgInN0YXRpY192YXJpYWJsZXMucGdjIgorCitpZiAo
c3FsY2Euc3FsY29kZSA8IDApIGV4aXQgKDEpO30KKyNsaW5lIDExNiAic3RhdGljX3ZhcmlhYmxl
cy5wZ2MiCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2VjcGcv
dGVzdC9leHBlY3RlZC9wcmVwcm9jLXN0YXRpY192YXJpYWJsZXMuc3RkZXJyIGIvc3JjL2ludGVy
ZmFjZXMvZWNwZy90ZXN0L2V4cGVjdGVkL3ByZXByb2Mtc3RhdGljX3ZhcmlhYmxlcy5zdGRlcnIK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uYjNlOTRmMWM1MgotLS0gL2Rl
di9udWxsCisrKyBiL3NyYy9pbnRlcmZhY2VzL2VjcGcvdGVzdC9leHBlY3RlZC9wcmVwcm9jLXN0
YXRpY192YXJpYWJsZXMuc3RkZXJyCkBAIC0wLDAgKzEsMTUwIEBACitbTk9fUElEXTogRUNQR2Rl
YnVnOiBzZXQgdG8gMQorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tO
T19QSURdOiBFQ1BHY29ubmVjdDogb3BlbmluZyBkYXRhYmFzZSBlY3BnMV9yZWdyZXNzaW9uIG9u
IDxERUZBVUxUPiBwb3J0IDxERUZBVUxUPiAgCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0
YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZXhlY3V0ZSBvbiBsaW5lIDQwOiBxdWVyeTogY3Jl
YXRlIHRhYmxlIHBlcnNvbnMgKCBmaXJzdG5hbWUgdmFyY2hhciAoIDUwICkgbm90IG51bGwgLCBs
YXN0bmFtZSB2YXJjaGFyICggNTAgKSBub3QgbnVsbCAsIGFkZHJlc3MgdmFyY2hhciAoIDI1NSAp
IG5vdCBudWxsICwgeWVhcl9vZl9iaXJ0aCBpbnQgbm90IG51bGwgLCBoZWlnaHRfaW5fc20gaW50
IG5vdCBudWxsICwgd2VpZ2h0X2luX2tnIGludCBub3QgbnVsbCAsIGRhdGExIGJ5dGVhIG5vdCBu
dWxsICwgZGF0YTIgYnl0ZWEgbm90IG51bGwgLCBkYXRhMyBieXRlYSBub3QgbnVsbCApOyB3aXRo
IDAgcGFyYW1ldGVyKHMpIG9uIGNvbm5lY3Rpb24gZWNwZzFfcmVncmVzc2lvbgorW05PX1BJRF06
IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2V4ZWN1dGUgb24g
bGluZSA0MDogdXNpbmcgUFFleGVjCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAw
MDAwMAorW05PX1BJRF06IGVjcGdfcHJvY2Vzc19vdXRwdXQgb24gbGluZSA0MDogT0s6IENSRUFU
RSBUQUJMRQorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURd
OiBlY3BnX2V4ZWN1dGUgb24gbGluZSA2NDogcXVlcnk6IGluc2VydCBpbnRvIHBlcnNvbnMgKCBm
aXJzdG5hbWUgLCBsYXN0bmFtZSAsIGFkZHJlc3MgLCB5ZWFyX29mX2JpcnRoICwgaGVpZ2h0X2lu
X3NtICwgd2VpZ2h0X2luX2tnICwgZGF0YTEgLCBkYXRhMiAsIGRhdGEzICkgdmFsdWVzICggJ2Zp
cnN0bmFtZTEnICwgJ2xhc3RuYW1lMScgLCAnYWRkcmVzczEnICwgMTk4NSAsIDE4MCAsIDcwICwg
JDEgICwgJDIgICwgJDMgICk7IHdpdGggMyBwYXJhbWV0ZXIocykgb24gY29ubmVjdGlvbiBlY3Bn
MV9yZWdyZXNzaW9uCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05P
X1BJRF06IGVjcGdfZXhlY3V0ZSBvbiBsaW5lIDY0OiB1c2luZyBQUWV4ZWNQYXJhbXMKK1tOT19Q
SURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19mcmVlX3Bh
cmFtcyBvbiBsaW5lIDY0OiBwYXJhbWV0ZXIgMSA9IDAxMDEwMTAxMDEKK1tOT19QSURdOiBzcWxj
YTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19mcmVlX3BhcmFtcyBvbiBs
aW5lIDY0OiBwYXJhbWV0ZXIgMiA9IDAyMDIwMjAyMDIwMjAyMDIKK1tOT19QSURdOiBzcWxjYTog
Y29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19mcmVlX3BhcmFtcyBvbiBsaW5l
IDY0OiBwYXJhbWV0ZXIgMyA9IDAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMworW05PX1BJRF06IHNx
bGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX3Byb2Nlc3Nfb3V0cHV0
IG9uIGxpbmUgNjQ6IE9LOiBJTlNFUlQgMCAxCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0
YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZXhlY3V0ZSBvbiBsaW5lIDczOiBxdWVyeTogaW5z
ZXJ0IGludG8gcGVyc29ucyAoIGZpcnN0bmFtZSAsIGxhc3RuYW1lICwgYWRkcmVzcyAsIHllYXJf
b2ZfYmlydGggLCBoZWlnaHRfaW5fc20gLCB3ZWlnaHRfaW5fa2cgLCBkYXRhMSAsIGRhdGEyICwg
ZGF0YTMgKSB2YWx1ZXMgKCAnZmlyc3RuYW1lMicgLCAnbGFzdG5hbWUyJyAsICdhZGRyZXNzMicg
LCAxOTk1ICwgMTcwICwgNjUgLCAkMSAgLCAkMiAgLCAkMyAgKTsgd2l0aCAzIHBhcmFtZXRlcihz
KSBvbiBjb25uZWN0aW9uIGVjcGcxX3JlZ3Jlc3Npb24KK1tOT19QSURdOiBzcWxjYTogY29kZTog
MCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19leGVjdXRlIG9uIGxpbmUgNzM6IHVzaW5n
IFBRZXhlY1BhcmFtcworW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tO
T19QSURdOiBlY3BnX2ZyZWVfcGFyYW1zIG9uIGxpbmUgNzM6IHBhcmFtZXRlciAxID0gMDEwMTAx
MDEwMQorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBl
Y3BnX2ZyZWVfcGFyYW1zIG9uIGxpbmUgNzM6IHBhcmFtZXRlciAyID0gMDIwMjAyMDIwMjAyMDIw
MgorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3Bn
X2ZyZWVfcGFyYW1zIG9uIGxpbmUgNzM6IHBhcmFtZXRlciAzID0gMDMwMzAzMDMwMzAzMDMwMzAz
MDMwMzAzCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06
IGVjcGdfcHJvY2Vzc19vdXRwdXQgb24gbGluZSA3MzogT0s6IElOU0VSVCAwIDEKK1tOT19QSURd
OiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19leGVjdXRlIG9u
IGxpbmUgODI6IHF1ZXJ5OiBpbnNlcnQgaW50byBwZXJzb25zICggZmlyc3RuYW1lICwgbGFzdG5h
bWUgLCBhZGRyZXNzICwgeWVhcl9vZl9iaXJ0aCAsIGhlaWdodF9pbl9zbSAsIHdlaWdodF9pbl9r
ZyAsIGRhdGExICwgZGF0YTIgLCBkYXRhMyApIHZhbHVlcyAoICdmaXJzdG5hbWUzJyAsICdsYXN0
bmFtZTMnICwgJ2FkZHJlc3MzJyAsIDIwMDAgLCAxNzIgLCA4MCAsICQxICAsICQyICAsICQzICAp
OyB3aXRoIDMgcGFyYW1ldGVyKHMpIG9uIGNvbm5lY3Rpb24gZWNwZzFfcmVncmVzc2lvbgorW05P
X1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2V4ZWN1
dGUgb24gbGluZSA4MjogdXNpbmcgUFFleGVjUGFyYW1zCitbTk9fUElEXTogc3FsY2E6IGNvZGU6
IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZnJlZV9wYXJhbXMgb24gbGluZSA4Mjog
cGFyYW1ldGVyIDEgPSAwMTAxMDEwMTAxCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRl
OiAwMDAwMAorW05PX1BJRF06IGVjcGdfZnJlZV9wYXJhbXMgb24gbGluZSA4MjogcGFyYW1ldGVy
IDIgPSAwMjAyMDIwMjAyMDIwMjAyCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAw
MDAwMAorW05PX1BJRF06IGVjcGdfZnJlZV9wYXJhbXMgb24gbGluZSA4MjogcGFyYW1ldGVyIDMg
PSAwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3Rh
dGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19wcm9jZXNzX291dHB1dCBvbiBsaW5lIDgyOiBPSzog
SU5TRVJUIDAgMQorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19Q
SURdOiBFQ1BHdHJhbnMgb24gbGluZSA5MTogYWN0aW9uICJjb21taXQiOyBjb25uZWN0aW9uICJl
Y3BnMV9yZWdyZXNzaW9uIgorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAK
K1tOT19QSURdOiBlY3BnX2V4ZWN1dGUgb24gbGluZSA5MzogcXVlcnk6IGRlY2xhcmUgY3VyIGN1
cnNvciBmb3Igc2VsZWN0IGZpcnN0bmFtZSAsIGxhc3RuYW1lICwgYWRkcmVzcyAsIHllYXJfb2Zf
YmlydGggLCBoZWlnaHRfaW5fc20gLCB3ZWlnaHRfaW5fa2cgLCBkYXRhMSAsIGRhdGEyICwgZGF0
YTMgZnJvbSBwZXJzb25zOyB3aXRoIDAgcGFyYW1ldGVyKHMpIG9uIGNvbm5lY3Rpb24gZWNwZzFf
cmVncmVzc2lvbgorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19Q
SURdOiBlY3BnX2V4ZWN1dGUgb24gbGluZSA5MzogdXNpbmcgUFFleGVjCitbTk9fUElEXTogc3Fs
Y2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfcHJvY2Vzc19vdXRwdXQg
b24gbGluZSA5MzogT0s6IERFQ0xBUkUgQ1VSU09SCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAs
IHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZXhlY3V0ZSBvbiBsaW5lIDk5OiBxdWVyeTog
ZmV0Y2ggY3VyOyB3aXRoIDAgcGFyYW1ldGVyKHMpIG9uIGNvbm5lY3Rpb24gZWNwZzFfcmVncmVz
c2lvbgorW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBl
Y3BnX2V4ZWN1dGUgb24gbGluZSA5OTogdXNpbmcgUFFleGVjCitbTk9fUElEXTogc3FsY2E6IGNv
ZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfcHJvY2Vzc19vdXRwdXQgb24gbGlu
ZSA5OTogY29ycmVjdGx5IGdvdCAxIHR1cGxlcyB3aXRoIDkgZmllbGRzCitbTk9fUElEXTogc3Fs
Y2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZ2V0X2RhdGEgb24gbGlu
ZSA5OTogUkVTVUxUOiBmaXJzdG5hbWUxIG9mZnNldDogLTE7IGFycmF5OiBubworW05PX1BJRF06
IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2dldF9kYXRhIG9u
IGxpbmUgOTk6IFJFU1VMVDogbGFzdG5hbWUxIG9mZnNldDogLTE7IGFycmF5OiBubworW05PX1BJ
RF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2dldF9kYXRh
IG9uIGxpbmUgOTk6IFJFU1VMVDogYWRkcmVzczEgb2Zmc2V0OiAtMTsgYXJyYXk6IG5vCitbTk9f
UElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZ2V0X2Rh
dGEgb24gbGluZSA5OTogUkVTVUxUOiAxOTg1IG9mZnNldDogLTE7IGFycmF5OiBubworW05PX1BJ
RF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2dldF9kYXRh
IG9uIGxpbmUgOTk6IFJFU1VMVDogMTgwIG9mZnNldDogLTE7IGFycmF5OiBubworW05PX1BJRF06
IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2dldF9kYXRhIG9u
IGxpbmUgOTk6IFJFU1VMVDogNzAgb2Zmc2V0OiAtMTsgYXJyYXk6IG5vCitbTk9fUElEXTogc3Fs
Y2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZ2V0X2RhdGEgb24gbGlu
ZSA5OTogUkVTVUxUOiBceDAxMDEwMTAxMDEgb2Zmc2V0OiAtMTsgYXJyYXk6IG5vCitbTk9fUElE
XTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZ2V0X2RhdGEg
b24gbGluZSA5OTogUkVTVUxUOiBceDAyMDIwMjAyMDIwMjAyMDIgb2Zmc2V0OiAtMTsgYXJyYXk6
IG5vCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVj
cGdfZ2V0X2RhdGEgb24gbGluZSA5OTogUkVTVUxUOiBceDAzMDMwMzAzMDMwMzAzMDMwMzAzMDMw
MyBvZmZzZXQ6IC0xOyBhcnJheTogbm8KK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6
IDAwMDAwCitbTk9fUElEXTogZWNwZ19leGVjdXRlIG9uIGxpbmUgOTk6IHF1ZXJ5OiBmZXRjaCBj
dXI7IHdpdGggMCBwYXJhbWV0ZXIocykgb24gY29ubmVjdGlvbiBlY3BnMV9yZWdyZXNzaW9uCitb
Tk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZXhl
Y3V0ZSBvbiBsaW5lIDk5OiB1c2luZyBQUWV4ZWMKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwg
c3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19wcm9jZXNzX291dHB1dCBvbiBsaW5lIDk5OiBj
b3JyZWN0bHkgZ290IDEgdHVwbGVzIHdpdGggOSBmaWVsZHMKK1tOT19QSURdOiBzcWxjYTogY29k
ZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19nZXRfZGF0YSBvbiBsaW5lIDk5OiBS
RVNVTFQ6IGZpcnN0bmFtZTIgb2Zmc2V0OiAtMTsgYXJyYXk6IG5vCitbTk9fUElEXTogc3FsY2E6
IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZ2V0X2RhdGEgb24gbGluZSA5
OTogUkVTVUxUOiBsYXN0bmFtZTIgb2Zmc2V0OiAtMTsgYXJyYXk6IG5vCitbTk9fUElEXTogc3Fs
Y2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZ2V0X2RhdGEgb24gbGlu
ZSA5OTogUkVTVUxUOiBhZGRyZXNzMiBvZmZzZXQ6IC0xOyBhcnJheTogbm8KK1tOT19QSURdOiBz
cWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19nZXRfZGF0YSBvbiBs
aW5lIDk5OiBSRVNVTFQ6IDE5OTUgb2Zmc2V0OiAtMTsgYXJyYXk6IG5vCitbTk9fUElEXTogc3Fs
Y2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZ2V0X2RhdGEgb24gbGlu
ZSA5OTogUkVTVUxUOiAxNzAgb2Zmc2V0OiAtMTsgYXJyYXk6IG5vCitbTk9fUElEXTogc3FsY2E6
IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJRF06IGVjcGdfZ2V0X2RhdGEgb24gbGluZSA5
OTogUkVTVUxUOiA2NSBvZmZzZXQ6IC0xOyBhcnJheTogbm8KK1tOT19QSURdOiBzcWxjYTogY29k
ZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19nZXRfZGF0YSBvbiBsaW5lIDk5OiBS
RVNVTFQ6IFx4MDEwMTAxMDEwMSBvZmZzZXQ6IC0xOyBhcnJheTogbm8KK1tOT19QSURdOiBzcWxj
YTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19nZXRfZGF0YSBvbiBsaW5l
IDk5OiBSRVNVTFQ6IFx4MDIwMjAyMDIwMjAyMDIwMiBvZmZzZXQ6IC0xOyBhcnJheTogbm8KK1tO
T19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19nZXRf
ZGF0YSBvbiBsaW5lIDk5OiBSRVNVTFQ6IFx4MDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzIG9mZnNl
dDogLTE7IGFycmF5OiBubworW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAK
K1tOT19QSURdOiBlY3BnX2V4ZWN1dGUgb24gbGluZSA5OTogcXVlcnk6IGZldGNoIGN1cjsgd2l0
aCAwIHBhcmFtZXRlcihzKSBvbiBjb25uZWN0aW9uIGVjcGcxX3JlZ3Jlc3Npb24KK1tOT19QSURd
OiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19leGVjdXRlIG9u
IGxpbmUgOTk6IHVzaW5nIFBRZXhlYworW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTog
MDAwMDAKK1tOT19QSURdOiBlY3BnX3Byb2Nlc3Nfb3V0cHV0IG9uIGxpbmUgOTk6IGNvcnJlY3Rs
eSBnb3QgMSB0dXBsZXMgd2l0aCA5IGZpZWxkcworW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBz
dGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2dldF9kYXRhIG9uIGxpbmUgOTk6IFJFU1VMVDog
Zmlyc3RuYW1lMyBvZmZzZXQ6IC0xOyBhcnJheTogbm8KK1tOT19QSURdOiBzcWxjYTogY29kZTog
MCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19nZXRfZGF0YSBvbiBsaW5lIDk5OiBSRVNV
TFQ6IGxhc3RuYW1lMyBvZmZzZXQ6IC0xOyBhcnJheTogbm8KK1tOT19QSURdOiBzcWxjYTogY29k
ZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19nZXRfZGF0YSBvbiBsaW5lIDk5OiBS
RVNVTFQ6IGFkZHJlc3MzIG9mZnNldDogLTE7IGFycmF5OiBubworW05PX1BJRF06IHNxbGNhOiBj
b2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2dldF9kYXRhIG9uIGxpbmUgOTk6
IFJFU1VMVDogMjAwMCBvZmZzZXQ6IC0xOyBhcnJheTogbm8KK1tOT19QSURdOiBzcWxjYTogY29k
ZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19nZXRfZGF0YSBvbiBsaW5lIDk5OiBS
RVNVTFQ6IDE3MiBvZmZzZXQ6IC0xOyBhcnJheTogbm8KK1tOT19QSURdOiBzcWxjYTogY29kZTog
MCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19nZXRfZGF0YSBvbiBsaW5lIDk5OiBSRVNV
TFQ6IDgwIG9mZnNldDogLTE7IGFycmF5OiBubworW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBz
dGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2dldF9kYXRhIG9uIGxpbmUgOTk6IFJFU1VMVDog
XHgwMTAxMDEwMTAxIG9mZnNldDogLTE7IGFycmF5OiBubworW05PX1BJRF06IHNxbGNhOiBjb2Rl
OiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2dldF9kYXRhIG9uIGxpbmUgOTk6IFJF
U1VMVDogXHgwMjAyMDIwMjAyMDIwMjAyIG9mZnNldDogLTE7IGFycmF5OiBubworW05PX1BJRF06
IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2dldF9kYXRhIG9u
IGxpbmUgOTk6IFJFU1VMVDogXHgwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMgb2Zmc2V0OiAtMTsg
YXJyYXk6IG5vCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05PX1BJ
RF06IGVjcGdfZXhlY3V0ZSBvbiBsaW5lIDk5OiBxdWVyeTogZmV0Y2ggY3VyOyB3aXRoIDAgcGFy
YW1ldGVyKHMpIG9uIGNvbm5lY3Rpb24gZWNwZzFfcmVncmVzc2lvbgorW05PX1BJRF06IHNxbGNh
OiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2V4ZWN1dGUgb24gbGluZSA5
OTogdXNpbmcgUFFleGVjCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAor
W05PX1BJRF06IGVjcGdfcHJvY2Vzc19vdXRwdXQgb24gbGluZSA5OTogY29ycmVjdGx5IGdvdCAw
IHR1cGxlcyB3aXRoIDkgZmllbGRzCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAw
MDAwMAorW05PX1BJRF06IHJhaXNpbmcgc3FsY29kZSAxMDAgb24gbGluZSA5OTogbm8gZGF0YSBm
b3VuZCBvbiBsaW5lIDk5CitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDEwMCwgc3RhdGU6IDAyMDAw
CitbTk9fUElEXTogZWNwZ19leGVjdXRlIG9uIGxpbmUgMTEzOiBxdWVyeTogY2xvc2UgY3VyOyB3
aXRoIDAgcGFyYW1ldGVyKHMpIG9uIGNvbm5lY3Rpb24gZWNwZzFfcmVncmVzc2lvbgorW05PX1BJ
RF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX2V4ZWN1dGUg
b24gbGluZSAxMTM6IHVzaW5nIFBRZXhlYworW05PX1BJRF06IHNxbGNhOiBjb2RlOiAwLCBzdGF0
ZTogMDAwMDAKK1tOT19QSURdOiBlY3BnX3Byb2Nlc3Nfb3V0cHV0IG9uIGxpbmUgMTEzOiBPSzog
Q0xPU0UgQ1VSU09SCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMAorW05P
X1BJRF06IGVjcGdfZXhlY3V0ZSBvbiBsaW5lIDExNDogcXVlcnk6IGRyb3AgdGFibGUgcGVyc29u
czsgd2l0aCAwIHBhcmFtZXRlcihzKSBvbiBjb25uZWN0aW9uIGVjcGcxX3JlZ3Jlc3Npb24KK1tO
T19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19leGVj
dXRlIG9uIGxpbmUgMTE0OiB1c2luZyBQUWV4ZWMKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwg
c3RhdGU6IDAwMDAwCitbTk9fUElEXTogZWNwZ19wcm9jZXNzX291dHB1dCBvbiBsaW5lIDExNDog
T0s6IERST1AgVEFCTEUKK1tOT19QSURdOiBzcWxjYTogY29kZTogMCwgc3RhdGU6IDAwMDAwCitb
Tk9fUElEXTogRUNQR3RyYW5zIG9uIGxpbmUgMTE1OiBhY3Rpb24gImNvbW1pdCI7IGNvbm5lY3Rp
b24gImVjcGcxX3JlZ3Jlc3Npb24iCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAw
MDAwMAorW05PX1BJRF06IGVjcGdfZmluaXNoOiBjb25uZWN0aW9uIGVjcGcxX3JlZ3Jlc3Npb24g
Y2xvc2VkCitbTk9fUElEXTogc3FsY2E6IGNvZGU6IDAsIHN0YXRlOiAwMDAwMApkaWZmIC0tZ2l0
IGEvc3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L2V4cGVjdGVkL3ByZXByb2Mtc3RhdGljX3Zhcmlh
Ymxlcy5zdGRvdXQgYi9zcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvZXhwZWN0ZWQvcHJlcHJvYy1z
dGF0aWNfdmFyaWFibGVzLnN0ZG91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwLi5kNTE0OGY3OGZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2ludGVyZmFjZXMvZWNwZy90
ZXN0L2V4cGVjdGVkL3ByZXByb2Mtc3RhdGljX3ZhcmlhYmxlcy5zdGRvdXQKQEAgLTAsMCArMSwx
MiBAQAorZmlyc3RuYW1lMQlsYXN0bmFtZTEJYWRkcmVzczEJMTk4NQkxODAJNzAKK2xlbj01LCBk
YXRhPTB4MDEwMTAxMDEwMQorbGVuPTgsIGRhdGE9MHgwMjAyMDIwMjAyMDIwMjAyCitsZW49MTIs
IGRhdGE9MHgwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMKK2ZpcnN0bmFtZTIJbGFzdG5hbWUyCWFk
ZHJlc3MyCTE5OTUJMTcwCTY1CitsZW49NSwgZGF0YT0weDAxMDEwMTAxMDEKK2xlbj04LCBkYXRh
PTB4MDIwMjAyMDIwMjAyMDIwMgorbGVuPTEyLCBkYXRhPTB4MDMwMzAzMDMwMzAzMDMwMzAzMDMw
MzAzCitmaXJzdG5hbWUzCWxhc3RuYW1lMwlhZGRyZXNzMwkyMDAwCTE3Mgk4MAorbGVuPTUsIGRh
dGE9MHgwMTAxMDEwMTAxCitsZW49OCwgZGF0YT0weDAyMDIwMjAyMDIwMjAyMDIKK2xlbj0xMiwg
ZGF0YT0weDAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMwpkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFj
ZXMvZWNwZy90ZXN0L3ByZXByb2MvLmdpdGlnbm9yZSBiL3NyYy9pbnRlcmZhY2VzL2VjcGcvdGVz
dC9wcmVwcm9jLy5naXRpZ25vcmUKaW5kZXggZmQ2M2U2NDVhMy4uODMxYWNjYzUyNiAxMDA2NDQK
LS0tIGEvc3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L3ByZXByb2MvLmdpdGlnbm9yZQorKysgYi9z
cmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvcHJlcHJvYy8uZ2l0aWdub3JlCkBAIC0xNCw2ICsxNCw4
IEBACiAvb3V0b2ZzY29wZS5jCiAvcG9pbnRlcl90b19zdHJ1Y3QKIC9wb2ludGVyX3RvX3N0cnVj
dC5jCisvc3RhdGljX3ZhcmlhYmxlcworL3N0YXRpY192YXJpYWJsZXMuYwogL3N0cmluZ3MKIC9z
dHJpbmdzLmMKIC90eXBlCmRpZmYgLS1naXQgYS9zcmMvaW50ZXJmYWNlcy9lY3BnL3Rlc3QvcHJl
cHJvYy9NYWtlZmlsZSBiL3NyYy9pbnRlcmZhY2VzL2VjcGcvdGVzdC9wcmVwcm9jL01ha2VmaWxl
CmluZGV4IDM5YjE5NzRmNWYuLmEzY2ZlNjUzM2YgMTAwNjQ0Ci0tLSBhL3NyYy9pbnRlcmZhY2Vz
L2VjcGcvdGVzdC9wcmVwcm9jL01ha2VmaWxlCisrKyBiL3NyYy9pbnRlcmZhY2VzL2VjcGcvdGVz
dC9wcmVwcm9jL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBAIFRFU1RTID0gYXJyYXlfb2Zfc3Ry
dWN0IGFycmF5X29mX3N0cnVjdC5jIFwKIAljdXJzb3IgY3Vyc29yLmMgXAogCWRlZmluZSBkZWZp
bmUuYyBcCiAJaW5pdCBpbml0LmMgXAorCXN0YXRpY192YXJpYWJsZXMgc3RhdGljX3ZhcmlhYmxl
cy5jIFwKIAlzdHJpbmdzIHN0cmluZ3MuYyBcCiAJb3V0b2ZzY29wZSBvdXRvZnNjb3BlLmMgXAog
CXR5cGUgdHlwZS5jIFwKZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2VjcGcvdGVzdC9wcmVw
cm9jL3N0YXRpY192YXJpYWJsZXMucGdjIGIvc3JjL2ludGVyZmFjZXMvZWNwZy90ZXN0L3ByZXBy
b2Mvc3RhdGljX3ZhcmlhYmxlcy5wZ2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMC4uMDViZTg5OGUwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pbnRlcmZhY2VzL2VjcGcv
dGVzdC9wcmVwcm9jL3N0YXRpY192YXJpYWJsZXMucGdjCkBAIC0wLDAgKzEsMTE4IEBACisjaW5j
bHVkZSA8c3RkbGliLmg+CisKK2V4ZWMgc3FsIGluY2x1ZGUgLi4vcmVncmVzc2lvbjsKKworZXhl
YyBzcWwgd2hlbmV2ZXIgc3FsZXJyb3Igc3RvcDsKKworZXhlYyBzcWwgZGVjbGFyZSBjdXIgY3Vy
c29yIGZvcgorCXNlbGVjdCBmaXJzdG5hbWUsIGxhc3RuYW1lLCBhZGRyZXNzLAorCQkgICB5ZWFy
X29mX2JpcnRoLCBoZWlnaHRfaW5fc20sIHdlaWdodF9pbl9rZywKKwkJICAgZGF0YTEsIGRhdGEy
LCBkYXRhMworCWZyb20gcGVyc29uczsKKworZXhlYyBzcWwgYmVnaW4gZGVjbGFyZSBzZWN0aW9u
OworCXN0YXRpYyB2YXJjaGFyIGZpcnN0bmFtZVs1MF0sIGxhc3RuYW1lWzUwXSwgYWRkcmVzc1sy
NTVdOworCXN0YXRpYyBpbnQgeWVhcl9vZl9iaXJ0aCwgaGVpZ2h0X2luX3NtLCB3ZWlnaHRfaW5f
a2c7CisJc3RhdGljIGJ5dGVhIGRhdGExWzVdLCAgIGRhdGEyWzhdLCAgIGRhdGEzWzEyXSwKKwkJ
CQkgZGF0YTFfMls1XSwgZGF0YTJfMls4XSwgZGF0YTNfMlsxMl07IAorZXhlYyBzcWwgZW5kIGRl
Y2xhcmUgc2VjdGlvbjsKKworc3RhdGljIHZvaWQKK2R1bXBfYmluYXJ5KGNoYXIgKmJ1ZiwgaW50
IGxlbikKK3sKKwlpbnQgaTsKKworCXByaW50ZigibGVuPSVkLCBkYXRhPTB4IiwgbGVuKTsKKwlm
b3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCXByaW50ZigiJTAyeCIsIGJ1ZltpXSk7CisJcHJp
bnRmKCJcbiIpOworfQorCitpbnQKK21haW4gKHZvaWQpCit7CisJaW50IGxvb3Bjb3VudDsKKwor
CUVDUEdkZWJ1ZygxLCBzdGRlcnIpOworCisJZXhlYyBzcWwgY29ubmVjdCB0byBSRUdSRVNTREIx
OworCisJZXhlYyBzcWwgY3JlYXRlIHRhYmxlIHBlcnNvbnMgKAorCQlmaXJzdG5hbWUgdmFyY2hh
cig1MCkgbm90IG51bGwsCisJCWxhc3RuYW1lIHZhcmNoYXIoNTApIG5vdCBudWxsLAorCQlhZGRy
ZXNzIHZhcmNoYXIoMjU1KSBub3QgbnVsbCwKKwkJeWVhcl9vZl9iaXJ0aCBpbnQgbm90IG51bGws
CisJCWhlaWdodF9pbl9zbSBpbnQgbm90IG51bGwsCisJCXdlaWdodF9pbl9rZyBpbnQgbm90IG51
bGwsCisJCWRhdGExIGJ5dGVhIG5vdCBudWxsLAorCQlkYXRhMiBieXRlYSBub3QgbnVsbCwKKwkJ
ZGF0YTMgYnl0ZWEgbm90IG51bGwKKwkpOworCisJZGF0YTEubGVuID0gNTsKKwlmb3IgKGxvb3Bj
b3VudCA9IDA7IGxvb3Bjb3VudCA8IGRhdGExLmxlbjsgbG9vcGNvdW50KyspCisJCWRhdGExLmFy
cltsb29wY291bnRdID0gMTsKKworCWRhdGEyLmxlbiA9IDg7CisJZm9yIChsb29wY291bnQgPSAw
OyBsb29wY291bnQgPCBkYXRhMi5sZW47IGxvb3Bjb3VudCsrKQorCQlkYXRhMi5hcnJbbG9vcGNv
dW50XSA9IDI7CisKKwlkYXRhMy5sZW4gPSAxMjsKKwlmb3IgKGxvb3Bjb3VudCA9IDA7IGxvb3Bj
b3VudCA8IGRhdGEzLmxlbjsgbG9vcGNvdW50KyspCisJCWRhdGEzLmFycltsb29wY291bnRdID0g
MzsKKworCWV4ZWMgc3FsIGluc2VydCBpbnRvIHBlcnNvbnMgKAorCQkJCWZpcnN0bmFtZSwgbGFz
dG5hbWUsIGFkZHJlc3MsIAorCQkJCXllYXJfb2ZfYmlydGgsIGhlaWdodF9pbl9zbSwgd2VpZ2h0
X2luX2tnLAorCQkJCWRhdGExLCBkYXRhMiwgZGF0YTMpCisJCQkgdmFsdWVzICgKKwkJCQknZmly
c3RuYW1lMScsICdsYXN0bmFtZTEnLCAnYWRkcmVzczEnLAorCQkJCTE5ODUsIDE4MCwgNzAsCisJ
CQkJOmRhdGExLCA6ZGF0YTIsIDpkYXRhMyk7CisKKwlleGVjIHNxbCBpbnNlcnQgaW50byBwZXJz
b25zICgKKwkJCQlmaXJzdG5hbWUsIGxhc3RuYW1lLCBhZGRyZXNzLCAKKwkJCQl5ZWFyX29mX2Jp
cnRoLCBoZWlnaHRfaW5fc20sIHdlaWdodF9pbl9rZywKKwkJCQlkYXRhMSwgZGF0YTIsIGRhdGEz
KQorCQkJIHZhbHVlcyAoCisJCQkJJ2ZpcnN0bmFtZTInLCAnbGFzdG5hbWUyJywgJ2FkZHJlc3My
JywKKwkJCQkxOTk1LCAxNzAsIDY1LAorCQkJCTpkYXRhMSwgOmRhdGEyLCA6ZGF0YTMpOworCisJ
ZXhlYyBzcWwgaW5zZXJ0IGludG8gcGVyc29ucyAoCisJCQkJZmlyc3RuYW1lLCBsYXN0bmFtZSwg
YWRkcmVzcywgCisJCQkJeWVhcl9vZl9iaXJ0aCwgaGVpZ2h0X2luX3NtLCB3ZWlnaHRfaW5fa2cs
CisJCQkJZGF0YTEsIGRhdGEyLCBkYXRhMykKKwkJCSB2YWx1ZXMgKAorCQkJCSdmaXJzdG5hbWUz
JywgJ2xhc3RuYW1lMycsICdhZGRyZXNzMycsCisJCQkJMjAwMCwgMTcyLCA4MCwKKwkJCQk6ZGF0
YTEsIDpkYXRhMiwgOmRhdGEzKTsKKworCWV4ZWMgc3FsIGNvbW1pdDsKKworCWV4ZWMgc3FsIG9w
ZW4gY3VyOworCisJZXhlYyBzcWwgd2hlbmV2ZXIgbm90IGZvdW5kIGRvIGJyZWFrOworCisJZm9y
IChsb29wY291bnQgPSAwOyBsb29wY291bnQgPCAxMDA7IGxvb3Bjb3VudCsrKQorCXsKKwkJZXhl
YyBzcWwgZmV0Y2ggY3VyIGludG8gOmZpcnN0bmFtZSwgOmxhc3RuYW1lLCA6YWRkcmVzcywKKwkJ
CQkJCQkJOnllYXJfb2ZfYmlydGgsIDpoZWlnaHRfaW5fc20sIDp3ZWlnaHRfaW5fa2csCisJCQkJ
CQkJCTpkYXRhMV8yLCA6ZGF0YTJfMiwgOmRhdGEzXzI7CisKKwkJcHJpbnRmKCIlLipzXHQlLipz
XHQlLipzXHQlaVx0JWlcdCVpXG4iLAorCQkJZmlyc3RuYW1lLmxlbiwgZmlyc3RuYW1lLmFyciwK
KwkJCWxhc3RuYW1lLmxlbiwgbGFzdG5hbWUuYXJyLAorCQkJYWRkcmVzcy5sZW4sIGFkZHJlc3Mu
YXJyLAorCQkJeWVhcl9vZl9iaXJ0aCwgaGVpZ2h0X2luX3NtLCB3ZWlnaHRfaW5fa2cpOworCQlk
dW1wX2JpbmFyeShkYXRhMV8yLmFyciwgZGF0YTFfMi5sZW4pOworCQlkdW1wX2JpbmFyeShkYXRh
Ml8yLmFyciwgZGF0YTJfMi5sZW4pOworCQlkdW1wX2JpbmFyeShkYXRhM18yLmFyciwgZGF0YTNf
Mi5sZW4pOworCX0KKworCWV4ZWMgc3FsIGNsb3NlIGN1cjsKKwlleGVjIHNxbCBkcm9wIHRhYmxl
IHBlcnNvbnM7CisJZXhlYyBzcWwgY29tbWl0OworCWV4ZWMgc3FsIGRpc2Nvbm5lY3Q7CisJcmV0
dXJuIDA7Cit9Ci0tIAoyLjMzLjMKCg==
------==--bound.212839.iva6-d8ca7b1d7b79.qloud-c.yandex.net--





Attachments:

  [text/x-diff] v2-0001-Fix-storage-declaration-in-ECPG.patch (25.7K, ../../303741662583862@mail.yandex.ru/2-v2-0001-Fix-storage-declaration-in-ECPG.patch)
  download | inline diff:
From 5a4adc1b5a2a0adfc152debcaf825e7a95a47450 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 v2] 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  | 215 ++++++++++++++++++
 .../expected/preproc-static_variables.stderr  | 150 ++++++++++++
 .../expected/preproc-static_variables.stdout  |  12 +
 src/interfaces/ecpg/test/preproc/.gitignore   |   2 +
 src/interfaces/ecpg/test/preproc/Makefile     |   1 +
 .../ecpg/test/preproc/static_variables.pgc    | 118 ++++++++++
 9 files changed, 503 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..5a6bcee666
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/preproc-static_variables.c
@@ -0,0 +1,215 @@
+/* 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 , year_of_birth , height_in_sm , weight_in_kg , data1 , data2 , data3 from persons */
+#line 11 "static_variables.pgc"
+
+
+/* exec sql begin declare section */
+	    
+	    
+	        
+				    
+
+#line 14 "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 ;
+ 
+#line 15 "static_variables.pgc"
+ static int year_of_birth , height_in_sm , weight_in_kg ;
+ 
+#line 16 "static_variables.pgc"
+ static  struct bytea_1  { int len; char arr[ 5 ]; }  data1 ; static  struct bytea_2  { int len; char arr[ 8 ]; }  data2 ; static  struct bytea_3  { int len; char arr[ 12 ]; }  data3 ; static  struct bytea_4  { int len; char arr[ 5 ]; }  data1_2 ; static  struct bytea_5  { int len; char arr[ 8 ]; }  data2_2 ; static  struct bytea_6  { int len; char arr[ 12 ]; }  data3_2 ;
+/* exec sql end declare section */
+#line 18 "static_variables.pgc"
+
+
+static void
+dump_binary(char *buf, int len)
+{
+	int i;
+
+	printf("len=%d, data=0x", len);
+	for (i = 0; i < len; ++i)
+		printf("%02x", buf[i]);
+	printf("\n");
+}
+
+int
+main (void)
+{
+	int loopcount;
+
+	ECPGdebug(1, stderr);
+
+	{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); 
+#line 38 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 38 "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 , year_of_birth int not null , height_in_sm int not null , weight_in_kg int not null , data1 bytea not null , data2 bytea not null , data3 bytea not null )", ECPGt_EOIT, ECPGt_EORT);
+#line 50 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 50 "static_variables.pgc"
+
+
+	data1.len = 5;
+	for (loopcount = 0; loopcount < data1.len; loopcount++)
+		data1.arr[loopcount] = 1;
+
+	data2.len = 8;
+	for (loopcount = 0; loopcount < data2.len; loopcount++)
+		data2.arr[loopcount] = 2;
+
+	data3.len = 12;
+	for (loopcount = 0; loopcount < data3.len; loopcount++)
+		data3.arr[loopcount] = 3;
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into persons ( firstname , lastname , address , year_of_birth , height_in_sm , weight_in_kg , data1 , data2 , data3 ) values ( 'firstname1' , 'lastname1' , 'address1' , 1985 , 180 , 70 , $1  , $2  , $3  )", 
+	ECPGt_bytea,&(data1),(long)5,(long)1,sizeof(struct bytea_1), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_bytea,&(data2),(long)8,(long)1,sizeof(struct bytea_2), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_bytea,&(data3),(long)12,(long)1,sizeof(struct bytea_3), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 71 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 71 "static_variables.pgc"
+
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into persons ( firstname , lastname , address , year_of_birth , height_in_sm , weight_in_kg , data1 , data2 , data3 ) values ( 'firstname2' , 'lastname2' , 'address2' , 1995 , 170 , 65 , $1  , $2  , $3  )", 
+	ECPGt_bytea,&(data1),(long)5,(long)1,sizeof(struct bytea_1), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_bytea,&(data2),(long)8,(long)1,sizeof(struct bytea_2), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_bytea,&(data3),(long)12,(long)1,sizeof(struct bytea_3), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 80 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 80 "static_variables.pgc"
+
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into persons ( firstname , lastname , address , year_of_birth , height_in_sm , weight_in_kg , data1 , data2 , data3 ) values ( 'firstname3' , 'lastname3' , 'address3' , 2000 , 172 , 80 , $1  , $2  , $3  )", 
+	ECPGt_bytea,&(data1),(long)5,(long)1,sizeof(struct bytea_1), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_bytea,&(data2),(long)8,(long)1,sizeof(struct bytea_2), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_bytea,&(data3),(long)12,(long)1,sizeof(struct bytea_3), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
+#line 89 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 89 "static_variables.pgc"
+
+
+	{ ECPGtrans(__LINE__, NULL, "commit");
+#line 91 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 91 "static_variables.pgc"
+
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare cur cursor for select firstname , lastname , address , year_of_birth , height_in_sm , weight_in_kg , data1 , data2 , data3 from persons", ECPGt_EOIT, ECPGt_EORT);
+#line 93 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 93 "static_variables.pgc"
+
+
+	/* exec sql whenever not found  break ; */
+#line 95 "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_int,&(year_of_birth),(long)1,(long)1,sizeof(int), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_int,&(height_in_sm),(long)1,(long)1,sizeof(int), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_int,&(weight_in_kg),(long)1,(long)1,sizeof(int), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_bytea,&(data1_2),(long)5,(long)1,sizeof(struct bytea_4), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_bytea,&(data2_2),(long)8,(long)1,sizeof(struct bytea_5), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, 
+	ECPGt_bytea,&(data3_2),(long)12,(long)1,sizeof(struct bytea_6), 
+	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
+#line 101 "static_variables.pgc"
+
+if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
+#line 101 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 101 "static_variables.pgc"
+
+
+		printf("%.*s\t%.*s\t%.*s\t%i\t%i\t%i\n",
+			firstname.len, firstname.arr,
+			lastname.len, lastname.arr,
+			address.len, address.arr,
+			year_of_birth, height_in_sm, weight_in_kg);
+		dump_binary(data1_2.arr, data1_2.len);
+		dump_binary(data2_2.arr, data2_2.len);
+		dump_binary(data3_2.arr, data3_2.len);
+	}
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close cur", ECPGt_EOIT, ECPGt_EORT);
+#line 113 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 113 "static_variables.pgc"
+
+	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table persons", ECPGt_EOIT, ECPGt_EORT);
+#line 114 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 114 "static_variables.pgc"
+
+	{ ECPGtrans(__LINE__, NULL, "commit");
+#line 115 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 115 "static_variables.pgc"
+
+	{ ECPGdisconnect(__LINE__, "CURRENT");
+#line 116 "static_variables.pgc"
+
+if (sqlca.sqlcode < 0) exit (1);}
+#line 116 "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..b3e94f1c52
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/preproc-static_variables.stderr
@@ -0,0 +1,150 @@
+[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 40: query: create table persons ( firstname varchar ( 50 ) not null , lastname varchar ( 50 ) not null , address varchar ( 255 ) not null , year_of_birth int not null , height_in_sm int not null , weight_in_kg int not null , data1 bytea not null , data2 bytea not null , data3 bytea not null ); with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 40: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 40: OK: CREATE TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 64: query: insert into persons ( firstname , lastname , address , year_of_birth , height_in_sm , weight_in_kg , data1 , data2 , data3 ) values ( 'firstname1' , 'lastname1' , 'address1' , 1985 , 180 , 70 , $1  , $2  , $3  ); with 3 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 64: using PQexecParams
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_free_params on line 64: parameter 1 = 0101010101
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_free_params on line 64: parameter 2 = 0202020202020202
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_free_params on line 64: parameter 3 = 030303030303030303030303
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 64: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 73: query: insert into persons ( firstname , lastname , address , year_of_birth , height_in_sm , weight_in_kg , data1 , data2 , data3 ) values ( 'firstname2' , 'lastname2' , 'address2' , 1995 , 170 , 65 , $1  , $2  , $3  ); with 3 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 73: using PQexecParams
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_free_params on line 73: parameter 1 = 0101010101
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_free_params on line 73: parameter 2 = 0202020202020202
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_free_params on line 73: parameter 3 = 030303030303030303030303
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 73: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 82: query: insert into persons ( firstname , lastname , address , year_of_birth , height_in_sm , weight_in_kg , data1 , data2 , data3 ) values ( 'firstname3' , 'lastname3' , 'address3' , 2000 , 172 , 80 , $1  , $2  , $3  ); with 3 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 82: using PQexecParams
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_free_params on line 82: parameter 1 = 0101010101
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_free_params on line 82: parameter 2 = 0202020202020202
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_free_params on line 82: parameter 3 = 030303030303030303030303
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 82: OK: INSERT 0 1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 91: action "commit"; connection "ecpg1_regression"
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 93: query: declare cur cursor for select firstname , lastname , address , year_of_birth , height_in_sm , weight_in_kg , data1 , data2 , data3 from persons; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 93: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 93: OK: DECLARE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 99: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 99: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 99: correctly got 1 tuples with 9 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: firstname1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: lastname1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: address1 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: 1985 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: 180 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: 70 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: \x0101010101 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: \x0202020202020202 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: \x030303030303030303030303 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 99: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 99: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 99: correctly got 1 tuples with 9 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: firstname2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: lastname2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: address2 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: 1995 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: 170 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: 65 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: \x0101010101 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: \x0202020202020202 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: \x030303030303030303030303 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 99: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 99: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 99: correctly got 1 tuples with 9 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: firstname3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: lastname3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: address3 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: 2000 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: 172 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: 80 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: \x0101010101 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: \x0202020202020202 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_get_data on line 99: RESULT: \x030303030303030303030303 offset: -1; array: no
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 99: query: fetch cur; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 99: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 99: correctly got 0 tuples with 9 fields
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: raising sqlcode 100 on line 99: no data found on line 99
+[NO_PID]: sqlca: code: 100, state: 02000
+[NO_PID]: ecpg_execute on line 113: query: close cur; with 0 parameter(s) on connection ecpg1_regression
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 113: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 113: OK: CLOSE CURSOR
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 114: 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 114: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_process_output on line 114: OK: DROP TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ECPGtrans on line 115: 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..d5148f78fa
--- /dev/null
+++ b/src/interfaces/ecpg/test/expected/preproc-static_variables.stdout
@@ -0,0 +1,12 @@
+firstname1	lastname1	address1	1985	180	70
+len=5, data=0x0101010101
+len=8, data=0x0202020202020202
+len=12, data=0x030303030303030303030303
+firstname2	lastname2	address2	1995	170	65
+len=5, data=0x0101010101
+len=8, data=0x0202020202020202
+len=12, data=0x030303030303030303030303
+firstname3	lastname3	address3	2000	172	80
+len=5, data=0x0101010101
+len=8, data=0x0202020202020202
+len=12, data=0x030303030303030303030303
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..05be898e01
--- /dev/null
+++ b/src/interfaces/ecpg/test/preproc/static_variables.pgc
@@ -0,0 +1,118 @@
+#include <stdlib.h>
+
+exec sql include ../regression;
+
+exec sql whenever sqlerror stop;
+
+exec sql declare cur cursor for
+	select firstname, lastname, address,
+		   year_of_birth, height_in_sm, weight_in_kg,
+		   data1, data2, data3
+	from persons;
+
+exec sql begin declare section;
+	static varchar firstname[50], lastname[50], address[255];
+	static int year_of_birth, height_in_sm, weight_in_kg;
+	static bytea data1[5],   data2[8],   data3[12],
+				 data1_2[5], data2_2[8], data3_2[12]; 
+exec sql end declare section;
+
+static void
+dump_binary(char *buf, int len)
+{
+	int i;
+
+	printf("len=%d, data=0x", len);
+	for (i = 0; i < len; ++i)
+		printf("%02x", buf[i]);
+	printf("\n");
+}
+
+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,
+		year_of_birth int not null,
+		height_in_sm int not null,
+		weight_in_kg int not null,
+		data1 bytea not null,
+		data2 bytea not null,
+		data3 bytea not null
+	);
+
+	data1.len = 5;
+	for (loopcount = 0; loopcount < data1.len; loopcount++)
+		data1.arr[loopcount] = 1;
+
+	data2.len = 8;
+	for (loopcount = 0; loopcount < data2.len; loopcount++)
+		data2.arr[loopcount] = 2;
+
+	data3.len = 12;
+	for (loopcount = 0; loopcount < data3.len; loopcount++)
+		data3.arr[loopcount] = 3;
+
+	exec sql insert into persons (
+				firstname, lastname, address, 
+				year_of_birth, height_in_sm, weight_in_kg,
+				data1, data2, data3)
+			 values (
+				'firstname1', 'lastname1', 'address1',
+				1985, 180, 70,
+				:data1, :data2, :data3);
+
+	exec sql insert into persons (
+				firstname, lastname, address, 
+				year_of_birth, height_in_sm, weight_in_kg,
+				data1, data2, data3)
+			 values (
+				'firstname2', 'lastname2', 'address2',
+				1995, 170, 65,
+				:data1, :data2, :data3);
+
+	exec sql insert into persons (
+				firstname, lastname, address, 
+				year_of_birth, height_in_sm, weight_in_kg,
+				data1, data2, data3)
+			 values (
+				'firstname3', 'lastname3', 'address3',
+				2000, 172, 80,
+				:data1, :data2, :data3);
+
+	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,
+								:year_of_birth, :height_in_sm, :weight_in_kg,
+								:data1_2, :data2_2, :data3_2;
+
+		printf("%.*s\t%.*s\t%.*s\t%i\t%i\t%i\n",
+			firstname.len, firstname.arr,
+			lastname.len, lastname.arr,
+			address.len, address.arr,
+			year_of_birth, height_in_sm, weight_in_kg);
+		dump_binary(data1_2.arr, data1_2.len);
+		dump_binary(data2_2.arr, data2_2.len);
+		dump_binary(data3_2.arr, data3_2.len);
+	}
+
+	exec sql close cur;
+	exec sql drop table persons;
+	exec sql commit;
+	exec sql disconnect;
+	return 0;
+}
-- 
2.33.3



^ permalink  raw  reply  [nested|flat] 4+ messages in thread

* Re: [BUG] Storage declaration in ECPG
  2022-09-04 10:49 [BUG] Storage declaration in ECPG Andrey Sokolov <a.sokolov@arenadata.io>
  2022-09-05 08:12 ` Re: [BUG] Storage declaration in ECPG Kyotaro Horiguchi <horikyota.ntt@gmail.com>
  2022-09-07 20:57   ` Re: [BUG] Storage declaration in ECPG Andrey Sokolov <a.sokolov@arenadata.io>
@ 2022-09-09 19:36     ` Tom Lane <tgl@sss.pgh.pa.us>
  0 siblings, 0 replies; 4+ messages in thread

From: Tom Lane @ 2022-09-09 19:36 UTC (permalink / raw)
  To: Andrey Sokolov <a.sokolov@arenadata.io>; +Cc: Kyotaro Horiguchi <horikyota.ntt@gmail.com>; pgsql-hackers@lists.postgresql.org <pgsql-hackers@lists.postgresql.org>

Andrey Sokolov <a.sokolov@arenadata.io> writes:
> [ v2-0001-Fix-storage-declaration-in-ECPG.patch ]

Pushed.  I didn't think a whole new test case was appropriate,
either from the patch-footprint or test-runtime standpoint,
so I just added a couple of declarations to preproc/variable.pgc.

			regards, tom lane





^ permalink  raw  reply  [nested|flat] 4+ messages in thread


end of thread, other threads:[~2022-09-09 19:36 UTC | newest]

Thread overview: 4+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2022-09-04 10:49 [BUG] Storage declaration in ECPG Andrey Sokolov <a.sokolov@arenadata.io>
2022-09-05 08:12 ` Kyotaro Horiguchi <horikyota.ntt@gmail.com>
2022-09-07 20:57   ` Andrey Sokolov <a.sokolov@arenadata.io>
2022-09-09 19:36     ` Tom Lane <tgl@sss.pgh.pa.us>

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