Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1t5sJZ-0099yH-NW for pgsql-hackers@arkaria.postgresql.org; Tue, 29 Oct 2024 19:55:42 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1t5sJX-002SGy-6S for pgsql-hackers@arkaria.postgresql.org; Tue, 29 Oct 2024 19:55:39 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1t5sJW-002SEQ-GC for pgsql-hackers@lists.postgresql.org; Tue, 29 Oct 2024 19:55:39 +0000 Received: from smtp.outgoing.loopia.se ([93.188.3.37]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1t5sJO-003VFY-KF for pgsql-hackers@postgresql.org; Tue, 29 Oct 2024 19:55:37 +0000 Received: from s807.loopia.se (localhost [127.0.0.1]) by s807.loopia.se (Postfix) with ESMTP id 4BD301473D6 for ; Tue, 29 Oct 2024 20:55:27 +0100 (CET) Received: from s934.loopia.se (unknown [172.22.191.5]) by s807.loopia.se (Postfix) with ESMTP id 355841477F9; Tue, 29 Oct 2024 20:55:27 +0100 (CET) Received: from s472.loopia.se (unknown [172.22.191.5]) by s934.loopia.se (Postfix) with ESMTP id 327D67CEA73; Tue, 29 Oct 2024 20:55:27 +0100 (CET) X-Virus-Scanned: amavisd-new at amavis.loopia.se X-Spam-Flag: NO X-Spam-Score: -1.2 X-Spam-Level: X-Spam-Status: No, score=-1.2 tagged_above=-999 required=6.2 tests=[ALL_TRUSTED=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1] autolearn=disabled Authentication-Results: s472.loopia.se (amavisd-new); dkim=pass (2048-bit key) header.d=proxel.se Received: from s980.loopia.se ([172.22.191.5]) by s472.loopia.se (s472.loopia.se [172.22.190.12]) (amavisd-new, port 10024) with LMTP id DNo_ga5mdiBa; Tue, 29 Oct 2024 20:55:26 +0100 (CET) X-Loopia-Auth: user X-Loopia-User: andreas@proxel.se X-Loopia-Originating-IP: 158.174.129.34 Received: from [192.168.0.189] (h-158-174-129-34.NA.cust.bahnhof.se [158.174.129.34]) (Authenticated sender: andreas@proxel.se) by s980.loopia.se (Postfix) with ESMTPSA id EA2AC220168E; Tue, 29 Oct 2024 20:55:25 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proxel.se; s=loopiadkim1707418970; t=1730231726; bh=036GMvMvy0lqcWQpkLjv69YM4YxnyC78I8FhxfKwVQg=; h=Date:Subject:To:Cc:References:From:In-Reply-To; b=k72zLT5DS75B3ZP1EPCdLkob0/OZ8XGJHTNQnN7OeufKY4g+FsodxOBHqCHRCxsIF 3ObJU2HpyUhvv5i9u8YTD4efoAwCyoyXrtgwc9i3EAovu4iIJaMoThGH30pa70O0TD 60+48yngp7DFUIe/i3uhbK4/Q+MvBADg9SlxB+FNeRpcqddmO/0Nj5BYBNgyuMjhXV wfPsfLGTsYz2g6n+iALK3meKc6HwIvsflmdxX7W+jkFPkr6HXPKVx+FWvAGbTPJT6n peTzvG+hiqPII/wpozweBJUC+06u7cfNyXEJYV8UjLR4InnC+8xE6hHTCdK38DOa9h E+z0dxCaKlnLw== Content-Type: multipart/mixed; boundary="------------3pmE2pqgzE0IZ7HSwgxAscF0" Message-ID: <0b862b93-dc70-4ba1-b27f-e09104bc4c2c@proxel.se> Date: Tue, 29 Oct 2024 20:55:25 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: SQL Property Graph Queries (SQL/PGQ) To: Ashutosh Bapat , Ajay Pal Cc: Imran Zaheer , Peter Eisentraut , pgsql-hackers References: <04c0abe2-e9c5-4ffc-97b2-bedc1e3cd178@eisentraut.org> Content-Language: en-US From: Andreas Karlsson In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------3pmE2pqgzE0IZ7HSwgxAscF0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit > Patches 0001 - 0006 are same as the previous set. > 0007 - fixes all the problems you reported till now and also the one I > found. The commit message describes the fixes in detail. Hi, I found a potential bug in the parsing of the left and right arrows. They can be broken up in - > and < - respectively. Does the SQL/PGQ standard really allow this? I found this while working on a patch of our own and I was trying to figure out how you guys had solved this very same problem that we ran into, and if you had done so in a better way. The fundamental problem is that parsing the left arrow as one token is a bit tricky due to how PostgreSQL treats operators ending with minus or plus. I have attached our very ugly solution for it (broken out from our patch) in case it helps you. Feel free to use it or ignore it. We do not plan to work on this right now since you are already working on the same problem. I especially dislike the static variable in our patch. And as far as I understand it you can avoid the static by changing the lexer to use the push parser so it can emit multiple terminal tokens from one parsed token, but I have not looked into push parsers and have no idea how this would affect performance. https://www.gnu.org/software/bison/manual/html_node/Push-Decl.html Examples: # SELECT count(*) FROM GRAPH_TABLE (g1 MATCH ()-[]->() COLUMNS (1 as one)); count ------- 32 (1 row) # SELECT count(*) FROM GRAPH_TABLE (g1 MATCH ()-[]- >() COLUMNS (1 as one)); count ------- 32 (1 row) # SELECT * FROM GRAPH_TABLE (myshop MATCH (o IS orders)<-[IS customer_orders]-(c IS customers) COLUMNS (c.name, o.ordered_when)); name | ordered_when -----------+-------------- customer1 | 2024-01-01 customer2 | 2024-01-02 (2 rows) # SELECT * FROM GRAPH_TABLE (myshop MATCH (o IS orders)< -[IS customer_orders]-(c IS customers) COLUMNS (c.name, o.ordered_when)); name | ordered_when -----------+-------------- customer1 | 2024-01-01 customer2 | 2024-01-02 (2 rows) Andreas --------------3pmE2pqgzE0IZ7HSwgxAscF0 Content-Type: text/x-patch; charset=UTF-8; name="0001-Broken-out-tokeniziation-of-arrows.patch" Content-Disposition: attachment; filename="0001-Broken-out-tokeniziation-of-arrows.patch" Content-Transfer-Encoding: base64 RnJvbSAwN2MzZTE5MDhkZTQxM2RiOWZhMzgzMTY1ZWFjNzhkZjBhODBhYjUwIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZWFzIEthcmxzc29uIDxhbmRyZWFzQHByb3hl bC5zZT4KRGF0ZTogVHVlLCAyOSBPY3QgMjAyNCAyMDoyMzoyNCArMDEwMApTdWJqZWN0OiBb UEFUQ0hdIEJyb2tlbiBvdXQgdG9rZW5pemlhdGlvbiBvZiBhcnJvd3MKCi0tLQogc3JjL2Jh Y2tlbmQvcGFyc2VyL2dyYW0ueSAgICAgICAgIHwgMjAgKysrKysrKysrKysrKystLS0KIHNy Yy9iYWNrZW5kL3BhcnNlci9zY2FuLmwgICAgICAgICB8IDM3ICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysKIHNyYy9mZV91dGlscy9wc3Fsc2Nhbi5sICAgICAgICAgICB8ICA1 ICsrKysrCiBzcmMvaW50ZXJmYWNlcy9lY3BnL3ByZXByb2MvcGdjLmwgfCAzNCArKysrKysr KysrKysrKysrKysrKysrKysrKysrCiBzcmMvcGwvcGxwZ3NxbC9zcmMvcGxfZ3JhbS55ICAg ICAgfCAgMSArCiA1IGZpbGVzIGNoYW5nZWQsIDk0IGluc2VydGlvbnMoKyksIDMgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcGFyc2VyL2dyYW0ueSBiL3NyYy9i YWNrZW5kL3BhcnNlci9ncmFtLnkKaW5kZXggZGQ0NTgxODJmMDIuLjhmMDdhMWM4YzBjIDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC9wYXJzZXIvZ3JhbS55CisrKyBiL3NyYy9iYWNrZW5k L3BhcnNlci9ncmFtLnkKQEAgLTY3Nyw2ICs2NzcsNyBAQCBzdGF0aWMgTm9kZSAqbWFrZVJl Y3Vyc2l2ZVZpZXdTZWxlY3QoY2hhciAqcmVsbmFtZSwgTGlzdCAqYWxpYXNlcywgTm9kZSAq cXVlcnkpOwogJXRva2VuIDxpdmFsPglJQ09OU1QgUEFSQU0KICV0b2tlbgkJCVRZUEVDQVNU IERPVF9ET1QgQ09MT05fRVFVQUxTIEVRVUFMU19HUkVBVEVSCiAldG9rZW4JCQlMRVNTX0VR VUFMUyBHUkVBVEVSX0VRVUFMUyBOT1RfRVFVQUxTCisldG9rZW4JCQlMRUZUX0FSUk9XX0xF U1MgTEVGVF9BUlJPV19NSU5VUyBSSUdIVF9BUlJPVwogCiAvKgogICogSWYgeW91IHdhbnQg dG8gbWFrZSBhbnkga2V5d29yZCBjaGFuZ2VzLCB1cGRhdGUgdGhlIGtleXdvcmQgdGFibGUg aW4KQEAgLTgxNyw3ICs4MTgsNyBAQCBzdGF0aWMgTm9kZSAqbWFrZVJlY3Vyc2l2ZVZpZXdT ZWxlY3QoY2hhciAqcmVsbmFtZSwgTGlzdCAqYWxpYXNlcywgTm9kZSAqcXVlcnkpOwogJWxl ZnQJCUFORAogJXJpZ2h0CQlOT1QKICVub25hc3NvYwlJUyBJU05VTEwgTk9UTlVMTAkvKiBJ UyBzZXRzIHByZWNlZGVuY2UgZm9yIElTIE5VTEwsIGV0YyAqLwotJW5vbmFzc29jCSc8JyAn PicgJz0nIExFU1NfRVFVQUxTIEdSRUFURVJfRVFVQUxTIE5PVF9FUVVBTFMKKyVub25hc3Nv YwknPCcgTEVGVF9BUlJPV19MRVNTICc+JyAnPScgTEVTU19FUVVBTFMgR1JFQVRFUl9FUVVB TFMgTk9UX0VRVUFMUwogJW5vbmFzc29jCUJFVFdFRU4gSU5fUCBMSUtFIElMSUtFIFNJTUlM QVIgTk9UX0xBCiAlbm9uYXNzb2MJRVNDQVBFCQkJLyogRVNDQVBFIG11c3QgYmUganVzdCBh Ym92ZSBMSUtFL0lMSUtFL1NJTUlMQVIgKi8KIApAQCAtODcwLDggKzg3MSw4IEBAIHN0YXRp YyBOb2RlICptYWtlUmVjdXJzaXZlVmlld1NlbGVjdChjaGFyICpyZWxuYW1lLCBMaXN0ICph bGlhc2VzLCBOb2RlICpxdWVyeSk7CiAlbm9uYXNzb2MJVU5CT1VOREVEIE5FU1RFRCAvKiBp ZGVhbGx5IHdvdWxkIGhhdmUgc2FtZSBwcmVjZWRlbmNlIGFzIElERU5UICovCiAlbm9uYXNz b2MJSURFTlQgUEFSVElUSU9OIFJBTkdFIFJPV1MgR1JPVVBTIFBSRUNFRElORyBGT0xMT1dJ TkcgQ1VCRSBST0xMVVAKIAkJCVNFVCBLRVlTIE9CSkVDVF9QIFNDQUxBUiBWQUxVRV9QIFdJ VEggV0lUSE9VVCBQQVRICi0lbGVmdAkJT3AgT1BFUkFUT1IJCS8qIG11bHRpLWNoYXJhY3Rl ciBvcHMgYW5kIHVzZXItZGVmaW5lZCBvcGVyYXRvcnMgKi8KLSVsZWZ0CQknKycgJy0nCisl bGVmdAkJT3AgT1BFUkFUT1IgUklHSFRfQVJST1cJLyogbXVsdGktY2hhcmFjdGVyIG9wcyBh bmQgdXNlci1kZWZpbmVkIG9wZXJhdG9ycyAqLworJWxlZnQJCScrJyAnLScgTEVGVF9BUlJP V19NSU5VUwogJWxlZnQJCScqJyAnLycgJyUnCiAlbGVmdAkJJ14nCiAvKiBVbmFyeSBPcGVy YXRvcnMgKi8KQEAgLTE0ODQyLDYgKzE0ODQzLDggQEAgYV9leHByOgkJY19leHByCQkJCQkJ CQkJeyAkJCA9ICQxOyB9CiAJCQkJeyAkJCA9IChOb2RlICopIG1ha2VTaW1wbGVBX0V4cHIo QUVYUFJfT1AsICIrIiwgTlVMTCwgJDIsIEAxKTsgfQogCQkJfCAnLScgYV9leHByCQkJCQkl cHJlYyBVTUlOVVMKIAkJCQl7ICQkID0gZG9OZWdhdGUoJDIsIEAxKTsgfQorCQkJfCBMRUZU X0FSUk9XX01JTlVTIGFfZXhwcgkJJXByZWMgVU1JTlVTCisJCQkJeyAkJCA9IGRvTmVnYXRl KCQyLCBAMSk7IH0KIAkJCXwgYV9leHByICcrJyBhX2V4cHIKIAkJCQl7ICQkID0gKE5vZGUg KikgbWFrZVNpbXBsZUFfRXhwcihBRVhQUl9PUCwgIisiLCAkMSwgJDMsIEAyKTsgfQogCQkJ fCBhX2V4cHIgJy0nIGFfZXhwcgpAQCAtMTQ4NTYsNiArMTQ4NTksOCBAQCBhX2V4cHI6CQlj X2V4cHIJCQkJCQkJCQl7ICQkID0gJDE7IH0KIAkJCQl7ICQkID0gKE5vZGUgKikgbWFrZVNp bXBsZUFfRXhwcihBRVhQUl9PUCwgIl4iLCAkMSwgJDMsIEAyKTsgfQogCQkJfCBhX2V4cHIg JzwnIGFfZXhwcgogCQkJCXsgJCQgPSAoTm9kZSAqKSBtYWtlU2ltcGxlQV9FeHByKEFFWFBS X09QLCAiPCIsICQxLCAkMywgQDIpOyB9CisJCQl8IGFfZXhwciBMRUZUX0FSUk9XX0xFU1Mg YV9leHByCisJCQkJeyAkJCA9IChOb2RlICopIG1ha2VTaW1wbGVBX0V4cHIoQUVYUFJfT1As ICI8IiwgJDEsICQzLCBAMik7IH0KIAkJCXwgYV9leHByICc+JyBhX2V4cHIKIAkJCQl7ICQk ID0gKE5vZGUgKikgbWFrZVNpbXBsZUFfRXhwcihBRVhQUl9PUCwgIj4iLCAkMSwgJDMsIEAy KTsgfQogCQkJfCBhX2V4cHIgJz0nIGFfZXhwcgpAQCAtMTQ4NjYsNiArMTQ4NzEsOCBAQCBh X2V4cHI6CQljX2V4cHIJCQkJCQkJCQl7ICQkID0gJDE7IH0KIAkJCQl7ICQkID0gKE5vZGUg KikgbWFrZVNpbXBsZUFfRXhwcihBRVhQUl9PUCwgIj49IiwgJDEsICQzLCBAMik7IH0KIAkJ CXwgYV9leHByIE5PVF9FUVVBTFMgYV9leHByCiAJCQkJeyAkJCA9IChOb2RlICopIG1ha2VT aW1wbGVBX0V4cHIoQUVYUFJfT1AsICI8PiIsICQxLCAkMywgQDIpOyB9CisJCQl8IGFfZXhw ciBSSUdIVF9BUlJPVyBhX2V4cHIKKwkJCQl7ICQkID0gKE5vZGUgKikgbWFrZVNpbXBsZUFf RXhwcihBRVhQUl9PUCwgIi0+IiwgJDEsICQzLCBAMik7IH0KIAogCQkJfCBhX2V4cHIgcXVh bF9PcCBhX2V4cHIJCQkJJXByZWMgT3AKIAkJCQl7ICQkID0gKE5vZGUgKikgbWFrZUFfRXhw cihBRVhQUl9PUCwgJDIsICQxLCAkMywgQDIpOyB9CkBAIC0xNTMzNSw2ICsxNTM0Miw4IEBA IGJfZXhwcjoJCWNfZXhwcgogCQkJCXsgJCQgPSAoTm9kZSAqKSBtYWtlU2ltcGxlQV9FeHBy KEFFWFBSX09QLCAiXiIsICQxLCAkMywgQDIpOyB9CiAJCQl8IGJfZXhwciAnPCcgYl9leHBy CiAJCQkJeyAkJCA9IChOb2RlICopIG1ha2VTaW1wbGVBX0V4cHIoQUVYUFJfT1AsICI8Iiwg JDEsICQzLCBAMik7IH0KKwkJCXwgYl9leHByIExFRlRfQVJST1dfTEVTUyBiX2V4cHIKKwkJ CQl7ICQkID0gKE5vZGUgKikgbWFrZVNpbXBsZUFfRXhwcihBRVhQUl9PUCwgIjwiLCAkMSwg JDMsIEAyKTsgfQogCQkJfCBiX2V4cHIgJz4nIGJfZXhwcgogCQkJCXsgJCQgPSAoTm9kZSAq KSBtYWtlU2ltcGxlQV9FeHByKEFFWFBSX09QLCAiPiIsICQxLCAkMywgQDIpOyB9CiAJCQl8 IGJfZXhwciAnPScgYl9leHByCkBAIC0xNTM0NSw2ICsxNTM1NCw4IEBAIGJfZXhwcjoJCWNf ZXhwcgogCQkJCXsgJCQgPSAoTm9kZSAqKSBtYWtlU2ltcGxlQV9FeHByKEFFWFBSX09QLCAi Pj0iLCAkMSwgJDMsIEAyKTsgfQogCQkJfCBiX2V4cHIgTk9UX0VRVUFMUyBiX2V4cHIKIAkJ CQl7ICQkID0gKE5vZGUgKikgbWFrZVNpbXBsZUFfRXhwcihBRVhQUl9PUCwgIjw+IiwgJDEs ICQzLCBAMik7IH0KKwkJCXwgYl9leHByIFJJR0hUX0FSUk9XIGJfZXhwcgorCQkJCXsgJCQg PSAoTm9kZSAqKSBtYWtlU2ltcGxlQV9FeHByKEFFWFBSX09QLCAiLT4iLCAkMSwgJDMsIEAy KTsgfQogCQkJfCBiX2V4cHIgcXVhbF9PcCBiX2V4cHIJCQkJJXByZWMgT3AKIAkJCQl7ICQk ID0gKE5vZGUgKikgbWFrZUFfRXhwcihBRVhQUl9PUCwgJDIsICQxLCAkMywgQDIpOyB9CiAJ CQl8IHF1YWxfT3AgYl9leHByCQkJCQklcHJlYyBPcApAQCAtMTY1MDMsMTYgKzE2NTE0LDE5 IEBAIGFsbF9PcDoJCU9wCQkJCQkJCQkJCXsgJCQgPSAkMTsgfQogCiBNYXRoT3A6CQkgJysn CQkJCQkJCQkJeyAkJCA9ICIrIjsgfQogCQkJfCAnLScJCQkJCQkJCQl7ICQkID0gIi0iOyB9 CisJCQl8IExFRlRfQVJST1dfTUlOVVMJCQkJCQl7ICQkID0gIi0iOyB9CiAJCQl8ICcqJwkJ CQkJCQkJCXsgJCQgPSAiKiI7IH0KIAkJCXwgJy8nCQkJCQkJCQkJeyAkJCA9ICIvIjsgfQog CQkJfCAnJScJCQkJCQkJCQl7ICQkID0gIiUiOyB9CiAJCQl8ICdeJwkJCQkJCQkJCXsgJCQg PSAiXiI7IH0KIAkJCXwgJzwnCQkJCQkJCQkJeyAkJCA9ICI8IjsgfQorCQkJfCBMRUZUX0FS Uk9XX0xFU1MJCQkJCQl7ICQkID0gIjwiOyB9CiAJCQl8ICc+JwkJCQkJCQkJCXsgJCQgPSAi PiI7IH0KIAkJCXwgJz0nCQkJCQkJCQkJeyAkJCA9ICI9IjsgfQogCQkJfCBMRVNTX0VRVUFM UwkJCQkJCQl7ICQkID0gIjw9IjsgfQogCQkJfCBHUkVBVEVSX0VRVUFMUwkJCQkJCXsgJCQg PSAiPj0iOyB9CiAJCQl8IE5PVF9FUVVBTFMJCQkJCQkJeyAkJCA9ICI8PiI7IH0KKwkJCXwg UklHSFRfQVJST1cJCQkJCQkJeyAkJCA9ICItPiI7IH0KIAkJOwogCiBxdWFsX09wOglPcApk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcGFyc2VyL3NjYW4ubCBiL3NyYy9iYWNrZW5kL3Bh cnNlci9zY2FuLmwKaW5kZXggOTk0ZWQ5OTk1YWMuLmQ3ZWQwNDAxMWIwIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9wYXJzZXIvc2Nhbi5sCisrKyBiL3NyYy9iYWNrZW5kL3BhcnNlci9z Y2FuLmwKQEAgLTM2Niw2ICszNjYsNyBAQCBsZXNzX2VxdWFscwkJIjw9IgogZ3JlYXRlcl9l cXVhbHMJIj49IgogbGVzc19ncmVhdGVyCSI8PiIKIG5vdF9lcXVhbHMJCSIhPSIKK3JpZ2h0 X2Fycm93CQkiLT4iCiAKIC8qCiAgKiAic2VsZiIgaXMgdGhlIHNldCBvZiBjaGFycyB0aGF0 IHNob3VsZCBiZSByZXR1cm5lZCBhcyBzaW5nbGUtY2hhcmFjdGVyCkBAIC00NTQsNiArNDU1 LDEwIEBAIG90aGVyCQkJLgogCiAlJQogCisleworCQlzdGF0aWMgYm9vbCBpbmxlZnRhcnJv dyA9IGZhbHNlOworJX0KKwoge3doaXRlc3BhY2V9CXsKIAkJCQkJLyogaWdub3JlICovCiAJ CQkJfQpAQCAtODkyLDggKzg5NywxOCBAQCBvdGhlcgkJCS4KIAkJCQkJcmV0dXJuIE5PVF9F UVVBTFM7CiAJCQkJfQogCit7cmlnaHRfYXJyb3d9CXsKKwkJCQkJU0VUX1lZTExPQygpOwor CQkJCQlyZXR1cm4gUklHSFRfQVJST1c7CisJCQkJfQorCiB7c2VsZn0JCQl7CiAJCQkJCVNF VF9ZWUxMT0MoKTsKKwkJCQkJaWYgKHl5dGV4dFswXSA9PSAnLScgJiYgaW5sZWZ0YXJyb3cp CisJCQkJCXsKKwkJCQkJCWlubGVmdGFycm93ID0gZmFsc2U7CisJCQkJCQlyZXR1cm4gTEVG VF9BUlJPV19NSU5VUzsKKwkJCQkJfQogCQkJCQlyZXR1cm4geXl0ZXh0WzBdOwogCQkJCX0K IApAQCAtOTE5LDYgKzkzNCwyNiBAQCBvdGhlcgkJCS4KIAkJCQkJaWYgKHNsYXNoc3RhcikK IAkJCQkJCW5jaGFycyA9IHNsYXNoc3RhciAtIHl5dGV4dDsKIAorCQkJCQlpZiAobmNoYXJz ID09IDIgJiYgeXl0ZXh0WzBdID09ICc8JyAmJiB5eXRleHRbMV0gPT0gJy0nKQorCQkJCQl7 CisJCQkJCQkvKiBTdHJpcCB0aGUgdW53YW50ZWQgY2hhcnMgZnJvbSB0aGUgdG9rZW4gKi8K KwkJCQkJCXl5bGVzcygxKTsKKworCQkJCQkJaW5sZWZ0YXJyb3cgPSB0cnVlOworCisJCQkJ CQlyZXR1cm4gTEVGVF9BUlJPV19MRVNTOworCQkJCQl9CisKKwkJCQkJaWYgKG5jaGFycyA9 PSAxICYmIHl5dGV4dFswXSA9PSAnLScgJiYgaW5sZWZ0YXJyb3cpCisJCQkJCXsKKwkJCQkJ CS8qIFN0cmlwIHRoZSB1bndhbnRlZCBjaGFycyBmcm9tIHRoZSB0b2tlbiAqLworCQkJCQkJ aWYgKG5jaGFycyA8IHl5bGVuZykKKwkJCQkJCQl5eWxlc3MobmNoYXJzKTsKKworCQkJCQkJ aW5sZWZ0YXJyb3cgPSBmYWxzZTsKKwkJCQkJCXJldHVybiBMRUZUX0FSUk9XX01JTlVTOwor CQkJCQl9CisKIAkJCQkJLyoKIAkJCQkJICogRm9yIFNRTCBjb21wYXRpYmlsaXR5LCAnKycg YW5kICctJyBjYW5ub3QgYmUgdGhlCiAJCQkJCSAqIGxhc3QgY2hhciBvZiBhIG11bHRpLWNo YXIgb3BlcmF0b3IgdW5sZXNzIHRoZSBvcGVyYXRvcgpAQCAtOTg5LDYgKzEwMjQsOCBAQCBv dGhlcgkJCS4KIAkJCQkJCQkJcmV0dXJuIE5PVF9FUVVBTFM7CiAJCQkJCQkJaWYgKHl5dGV4 dFswXSA9PSAnIScgJiYgeXl0ZXh0WzFdID09ICc9JykKIAkJCQkJCQkJcmV0dXJuIE5PVF9F UVVBTFM7CisJCQkJCQkJaWYgKHl5dGV4dFswXSA9PSAnLScgJiYgeXl0ZXh0WzFdID09ICc+ JykKKwkJCQkJCQkJcmV0dXJuIFJJR0hUX0FSUk9XOwogCQkJCQkJfQogCQkJCQl9CiAKZGlm ZiAtLWdpdCBhL3NyYy9mZV91dGlscy9wc3Fsc2Nhbi5sIGIvc3JjL2ZlX3V0aWxzL3BzcWxz Y2FuLmwKaW5kZXggOGU4YjA0OWUxNWYuLjZmOGZkN2NkMjU4IDEwMDY0NAotLS0gYS9zcmMv ZmVfdXRpbHMvcHNxbHNjYW4ubAorKysgYi9zcmMvZmVfdXRpbHMvcHNxbHNjYW4ubApAQCAt MzAyLDYgKzMwMiw3IEBAIGxlc3NfZXF1YWxzCQkiPD0iCiBncmVhdGVyX2VxdWFscwkiPj0i CiBsZXNzX2dyZWF0ZXIJIjw+Igogbm90X2VxdWFscwkJIiE9IgorcmlnaHRfYXJyb3cgICAg ICItPiIKIAogLyoKICAqICJzZWxmIiBpcyB0aGUgc2V0IG9mIGNoYXJzIHRoYXQgc2hvdWxk IGJlIHJldHVybmVkIGFzIHNpbmdsZS1jaGFyYWN0ZXIKQEAgLTY2MSw2ICs2NjIsMTAgQEAg b3RoZXIJCQkuCiAJCQkJCUVDSE87CiAJCQkJfQogCit7cmlnaHRfYXJyb3d9CXsKKwkJCQkJ RUNITzsKKwkJCQl9CisKIAkvKgogCSAqIFRoZXNlIHJ1bGVzIGFyZSBzcGVjaWZpYyB0byBw c3FsIC0tLSB0aGV5IGltcGxlbWVudCBwYXJlbnRoZXNpcwogCSAqIGNvdW50aW5nIGFuZCBk ZXRlY3Rpb24gb2YgY29tbWFuZC1lbmRpbmcgc2VtaWNvbG9uLiAgVGhlc2UgbXVzdApkaWZm IC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMvZWNwZy9wcmVwcm9jL3BnYy5sIGIvc3JjL2ludGVy ZmFjZXMvZWNwZy9wcmVwcm9jL3BnYy5sCmluZGV4IGYzYzAzNDgyYWVjLi5kMWZkMTJmZTVh ZiAxMDA2NDQKLS0tIGEvc3JjL2ludGVyZmFjZXMvZWNwZy9wcmVwcm9jL3BnYy5sCisrKyBi L3NyYy9pbnRlcmZhY2VzL2VjcGcvcHJlcHJvYy9wZ2MubApAQCAtMzM1LDYgKzMzNSw3IEBA IGxlc3NfZXF1YWxzCQkiPD0iCiBncmVhdGVyX2VxdWFscwkiPj0iCiBsZXNzX2dyZWF0ZXIJ Ijw+Igogbm90X2VxdWFscwkJIiE9IgorcmlnaHRfYXJyb3cJCSItPiIKIAogLyoKICAqICJz ZWxmIiBpcyB0aGUgc2V0IG9mIGNoYXJzIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGFzIHNp bmdsZS1jaGFyYWN0ZXIKQEAgLTQ2Myw2ICs0NjQsOCBAQCBjcHBsaW5lCQkJe3NwYWNlfSoj KFteaV1bQS1aYS16XSp8e2lmfXx7aWZkZWZ9fHtpZm5kZWZ9fHtpbXBvcnR9KSgoXC9cKlte Ki9dKlwqKwogJSUKIAogJXsKKwkJc3RhdGljIGJvb2wgaW5sZWZ0YXJyb3cgPSBmYWxzZTsK KwogCQkvKiBjb2RlIHRvIGV4ZWN1dGUgZHVyaW5nIHN0YXJ0IG9mIGVhY2ggY2FsbCBvZiB5 eWxleCgpICovCiAJCWNoYXIgKm5ld2RlZnN5bWJvbCA9IE5VTEw7CiAKQEAgLTg1NCw2ICs4 NTcsMTAgQEAgY3BwbGluZQkJCXtzcGFjZX0qIyhbXmldW0EtWmEtel0qfHtpZn18e2lmZGVm fXx7aWZuZGVmfXx7aW1wb3J0fSkoKFwvXCpbXiovXSpcKisKIAkJCQkJcmV0dXJuIE5PVF9F UVVBTFM7CiAJCQkJfQogCit7cmlnaHRfYXJyb3d9CXsKKwkJCQkJcmV0dXJuIFJJR0hUX0FS Uk9XOworCQkJCX0KKwoge2luZm9ybWl4X3NwZWNpYWx9IHsKIAkJCQkJLyogYXJlIHdlIHNp bXVsYXRpbmcgSW5mb3JtaXg/ICovCiAJCQkJCWlmIChJTkZPUk1JWF9NT0RFKQpAQCAtODcx LDYgKzg3OCwxMSBAQCBjcHBsaW5lCQkJe3NwYWNlfSojKFteaV1bQS1aYS16XSp8e2lmfXx7 aWZkZWZ9fHtpZm5kZWZ9fHtpbXBvcnR9KSgoXC9cKlteKi9dKlwqKwogCQkJCQkgKi8KIAkJ CQkJaWYgKHl5dGV4dFswXSA9PSAnOycgJiYgc3RydWN0X2xldmVsID09IDApCiAJCQkJCQlC RUdJTihDKTsKKwkJCQkJaWYgKHl5dGV4dFswXSA9PSAnLScgJiYgaW5sZWZ0YXJyb3cpCisJ CQkJCXsKKwkJCQkJCWlubGVmdGFycm93ID0gZmFsc2U7CisJCQkJCQlyZXR1cm4gTEVGVF9B UlJPV19NSU5VUzsKKwkJCQkJfQogCQkJCQlyZXR1cm4geXl0ZXh0WzBdOwogCQkJCX0KIApA QCAtODk2LDYgKzkwOCwyNiBAQCBjcHBsaW5lCQkJe3NwYWNlfSojKFteaV1bQS1aYS16XSp8 e2lmfXx7aWZkZWZ9fHtpZm5kZWZ9fHtpbXBvcnR9KSgoXC9cKlteKi9dKlwqKwogCQkJCQlp ZiAoc2xhc2hzdGFyKQogCQkJCQkJbmNoYXJzID0gc2xhc2hzdGFyIC0geXl0ZXh0OwogCisJ CQkJCWlmIChuY2hhcnMgPT0gMiAmJiB5eXRleHRbMF0gPT0gJzwnICYmIHl5dGV4dFsxXSA9 PSAnLScpCisJCQkJCXsKKwkJCQkJCS8qIFN0cmlwIHRoZSB1bndhbnRlZCBjaGFycyBmcm9t IHRoZSB0b2tlbiAqLworCQkJCQkJeXlsZXNzKDEpOworCisJCQkJCQlpbmxlZnRhcnJvdyA9 IHRydWU7CisKKwkJCQkJCXJldHVybiBMRUZUX0FSUk9XX0xFU1M7CisJCQkJCX0KKworCQkJ CQlpZiAobmNoYXJzID09IDEgJiYgeXl0ZXh0WzBdID09ICctJyAmJiBpbmxlZnRhcnJvdykK KwkJCQkJeworCQkJCQkJLyogU3RyaXAgdGhlIHVud2FudGVkIGNoYXJzIGZyb20gdGhlIHRv a2VuICovCisJCQkJCQlpZiAobmNoYXJzIDwgeXlsZW5nKQorCQkJCQkJCXl5bGVzcyhuY2hh cnMpOworCisJCQkJCQlpbmxlZnRhcnJvdyA9IGZhbHNlOworCQkJCQkJcmV0dXJuIExFRlRf QVJST1dfTUlOVVM7CisJCQkJCX0KKwogCQkJCQkvKgogCQkJCQkgKiBGb3IgU1FMIGNvbXBh dGliaWxpdHksICcrJyBhbmQgJy0nIGNhbm5vdCBiZSB0aGUKIAkJCQkJICogbGFzdCBjaGFy IG9mIGEgbXVsdGktY2hhciBvcGVyYXRvciB1bmxlc3MgdGhlIG9wZXJhdG9yCkBAIC05Njgs NiArMTAwMCw4IEBAIGNwcGxpbmUJCQl7c3BhY2V9KiMoW15pXVtBLVphLXpdKnx7aWZ9fHtp ZmRlZn18e2lmbmRlZn18e2ltcG9ydH0pKChcL1wqW14qL10qXCorCiAJCQkJCQkJCXJldHVy biBOT1RfRVFVQUxTOwogCQkJCQkJCWlmICh5eXRleHRbMF0gPT0gJyEnICYmIHl5dGV4dFsx XSA9PSAnPScpCiAJCQkJCQkJCXJldHVybiBOT1RfRVFVQUxTOworCQkJCQkJCWlmICh5eXRl eHRbMF0gPT0gJy0nICYmIHl5dGV4dFsxXSA9PSAnPicpCisJCQkJCQkJCXJldHVybiBSSUdI VF9BUlJPVzsKIAkJCQkJCX0KIAkJCQkJfQogCmRpZmYgLS1naXQgYS9zcmMvcGwvcGxwZ3Nx bC9zcmMvcGxfZ3JhbS55IGIvc3JjL3BsL3BscGdzcWwvc3JjL3BsX2dyYW0ueQppbmRleCA4 MTgyY2UyOGFhMS4uYzVjZWEzNzk1NTQgMTAwNjQ0Ci0tLSBhL3NyYy9wbC9wbHBnc3FsL3Ny Yy9wbF9ncmFtLnkKKysrIGIvc3JjL3BsL3BscGdzcWwvc3JjL3BsX2dyYW0ueQpAQCAtMjM3 LDYgKzIzNyw3IEBAIHN0YXRpYwl2b2lkCQkJY2hlY2tfcmFpc2VfcGFyYW1ldGVycyhQTHBn U1FMX3N0bXRfcmFpc2UgKnN0bXQpOwogJXRva2VuIDxpdmFsPglJQ09OU1QgUEFSQU0KICV0 b2tlbgkJCVRZUEVDQVNUIERPVF9ET1QgQ09MT05fRVFVQUxTIEVRVUFMU19HUkVBVEVSCiAl dG9rZW4JCQlMRVNTX0VRVUFMUyBHUkVBVEVSX0VRVUFMUyBOT1RfRVFVQUxTCisldG9rZW4J CQlMRUZUX0FSUk9XX0xFU1MgTEVGVF9BUlJPV19NSU5VUyBSSUdIVF9BUlJPVwogCiAvKgog ICogT3RoZXIgdG9rZW5zIHJlY29nbml6ZWQgYnkgcGxwZ3NxbCdzIGxleGVyIGludGVyZmFj ZSBsYXllciAocGxfc2Nhbm5lci5jKS4KLS0gCjIuNDUuMgoK --------------3pmE2pqgzE0IZ7HSwgxAscF0--