ruby-rdf / sparql

Ruby SPARQL library
http://rubygems.org/gems/sparql
The Unlicense
89 stars 14 forks source link

Regex error with ruby 3.2 #45

Closed white-gecko closed 1 year ago

white-gecko commented 1 year ago

Unfortunately there is some issue with using the sparql library on ruby 3.2, I have experienced the bug using your library in jekyll-rdf resp. the jod theme.

The issue can be reproduced with the following image (docker or podman):

FROM ruby:3.2-slim # ruby:3.2 and ruby:3.2-alpine give the same result
RUN gem install sparql
RUN echo "require 'sparql'" > bug.rb
RUN echo "sparql = SPARQL::Client.new(RDF::Graph.new << [:hello, RDF::RDFS.label, 'Hello, world!'])" >> bug.rb
RUN echo "sparql.query('SELECT ?s { ?s ?p ?o }')" >> bug.rb
CMD ruby bug.rb

or just running this code under ruby 3.2 I guess:

require 'sparql'
sparql = SPARQL::Client.new(RDF::Graph.new << [:hello, RDF::RDFS.label, 'Hello, world!'])
sparql.query('SELECT ?s { ?s ?p ?o }')

Complete output:

docker run sparql-bug
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:9: warning: already initialized constant SPARQL::Grammar::Terminals::U_CHARS1
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:9: warning: previous definition of U_CHARS1 was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:15: warning: already initialized constant SPARQL::Grammar::Terminals::U_CHARS2
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:15: warning: previous definition of U_CHARS2 was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:16: warning: already initialized constant SPARQL::Grammar::Terminals::IRI_RANGE
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:16: warning: previous definition of IRI_RANGE was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:19: warning: already initialized constant SPARQL::Grammar::Terminals::UCHAR
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:19: warning: previous definition of UCHAR was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:21: warning: already initialized constant SPARQL::Grammar::Terminals::PERCENT
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:21: warning: previous definition of PERCENT was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:23: warning: already initialized constant SPARQL::Grammar::Terminals::PN_LOCAL_ESC
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:23: warning: previous definition of PN_LOCAL_ESC was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:25: warning: already initialized constant SPARQL::Grammar::Terminals::PLX
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:25: warning: previous definition of PLX was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:27: warning: already initialized constant SPARQL::Grammar::Terminals::PN_CHARS_BASE
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:27: warning: previous definition of PN_CHARS_BASE was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:29: warning: already initialized constant SPARQL::Grammar::Terminals::PN_CHARS_U
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:29: warning: previous definition of PN_CHARS_U was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:31: warning: already initialized constant SPARQL::Grammar::Terminals::VARNAME
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:31: warning: previous definition of VARNAME was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:34: warning: already initialized constant SPARQL::Grammar::Terminals::PN_CHARS
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:34: warning: previous definition of PN_CHARS was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:35: warning: already initialized constant SPARQL::Grammar::Terminals::PN_LOCAL_BODY
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:35: warning: previous definition of PN_LOCAL_BODY was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:36: warning: already initialized constant SPARQL::Grammar::Terminals::PN_CHARS_BODY
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:36: warning: previous definition of PN_CHARS_BODY was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:38: warning: already initialized constant SPARQL::Grammar::Terminals::PN_PREFIX
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:38: warning: previous definition of PN_PREFIX was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:40: warning: already initialized constant SPARQL::Grammar::Terminals::PN_LOCAL
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:40: warning: previous definition of PN_LOCAL was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:42: warning: already initialized constant SPARQL::Grammar::Terminals::EXPONENT
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:42: warning: previous definition of EXPONENT was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:44: warning: already initialized constant SPARQL::Grammar::Terminals::ECHAR
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:44: warning: previous definition of ECHAR was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:46: warning: already initialized constant SPARQL::Grammar::Terminals::IRIREF
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:46: warning: previous definition of IRIREF was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:48: warning: already initialized constant SPARQL::Grammar::Terminals::PNAME_NS
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:48: warning: previous definition of PNAME_NS was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:50: warning: already initialized constant SPARQL::Grammar::Terminals::PNAME_LN
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:50: warning: previous definition of PNAME_LN was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:52: warning: already initialized constant SPARQL::Grammar::Terminals::BLANK_NODE_LABEL
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:52: warning: previous definition of BLANK_NODE_LABEL was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:54: warning: already initialized constant SPARQL::Grammar::Terminals::VAR1
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:54: warning: previous definition of VAR1 was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:56: warning: already initialized constant SPARQL::Grammar::Terminals::VAR2
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:56: warning: previous definition of VAR2 was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:58: warning: already initialized constant SPARQL::Grammar::Terminals::LANGTAG
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:58: warning: previous definition of LANGTAG was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:60: warning: already initialized constant SPARQL::Grammar::Terminals::INTEGER
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:60: warning: previous definition of INTEGER was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:62: warning: already initialized constant SPARQL::Grammar::Terminals::DECIMAL
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:62: warning: previous definition of DECIMAL was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:64: warning: already initialized constant SPARQL::Grammar::Terminals::DOUBLE
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:64: warning: previous definition of DOUBLE was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:66: warning: already initialized constant SPARQL::Grammar::Terminals::INTEGER_POSITIVE
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:66: warning: previous definition of INTEGER_POSITIVE was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:68: warning: already initialized constant SPARQL::Grammar::Terminals::DECIMAL_POSITIVE
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:68: warning: previous definition of DECIMAL_POSITIVE was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:70: warning: already initialized constant SPARQL::Grammar::Terminals::DOUBLE_POSITIVE
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:70: warning: previous definition of DOUBLE_POSITIVE was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:72: warning: already initialized constant SPARQL::Grammar::Terminals::INTEGER_NEGATIVE
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:72: warning: previous definition of INTEGER_NEGATIVE was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:74: warning: already initialized constant SPARQL::Grammar::Terminals::DECIMAL_NEGATIVE
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:74: warning: previous definition of DECIMAL_NEGATIVE was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:76: warning: already initialized constant SPARQL::Grammar::Terminals::DOUBLE_NEGATIVE
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:76: warning: previous definition of DOUBLE_NEGATIVE was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:78: warning: already initialized constant SPARQL::Grammar::Terminals::STRING_LITERAL1
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:78: warning: previous definition of STRING_LITERAL1 was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:80: warning: already initialized constant SPARQL::Grammar::Terminals::STRING_LITERAL2
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:80: warning: previous definition of STRING_LITERAL2 was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:82: warning: already initialized constant SPARQL::Grammar::Terminals::STRING_LITERAL_LONG1
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:82: warning: previous definition of STRING_LITERAL_LONG1 was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:84: warning: already initialized constant SPARQL::Grammar::Terminals::STRING_LITERAL_LONG2
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:84: warning: previous definition of STRING_LITERAL_LONG2 was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:87: warning: already initialized constant SPARQL::Grammar::Terminals::WS
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:87: warning: previous definition of WS was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:89: warning: already initialized constant SPARQL::Grammar::Terminals::NIL
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:89: warning: previous definition of NIL was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:91: warning: already initialized constant SPARQL::Grammar::Terminals::ANON
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:91: warning: previous definition of ANON was here
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:94:in `<module:Terminals>': end pattern with unmatched parenthesis: /ABS|ADD|ADJUST|ALL|ASC|ASK|AS|AVG|BASE|BINDINGS|BIND (RegexpError)
                 |BNODE|BOUND|BY|CEIL|CLEAR|COALESCE|CONCAT
                 |CONSTRUCT|CONTAINS|COPY|COUNT|CREATE|DATATYPE|DAY
                 |DEFAULT|DELETE(?m-ix:(?:\s|(?:#[^\n\r]*))+)DATA|DELETE(?m-ix:(?:\s|(?:#[^\n\r]*))+)WHERE|DELETE
                 |DESCRIBE|DESC|DISTINCT|DROP|ENCODE_FOR_URI|EXISTS
                 |FILTER|FLOOR|FROM|GRAPH|GROUP_CONCAT|GROUP|HAVING
                 |HOURS|IF|INSERT(?m-ix:(?:\s|(?:#[^\n\r]*))+)DATA|INSERT|INTO|IN|IRI
                 |LANGMATCHES|LANGTAG|LANG|LCASE|LIMIT|LOAD
                 |MAX|MD5|MINUS|MINUTES|MIN|MONTH|MOVE
                 |NAMED|NOT|NOW|OFFSET|OPTIONAL
                 |ORDER|PREFIX|RAND|REDUCED|REGEX|REPLACE|ROUND|SAMPLE|SECONDS
                 |SELECT|SEPARATOR|SERVICE
                 |SHA1|SHA224|SHA256|SHA384|SHA512|SILENT
                 |STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|STRUUID|SUBSTR|STR|SUM
                 |TIMEZONE|TO|TZ|UCASE|UNDEF|UNION|URI|USING|UUID|VALUES
                 |WHERE|WITH|YEAR
                 |isBLANK|isIRI|isURI|isLITERAL|isNUMERIC|sameTerm
                 |isTRIPLE|TRIPLE|SUBJECT|PREDICATE|OBJECT
                 |true
                 |false
                 |<<|>>
                 |\{\||\|\}
                 |&&|!=|!|<=|>=|\^\^|\|\||[\(\),.;\[\]\{\}\+\-=<>\?\^\|\*\/a]
              /mix
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:4:in `<module:Grammar>'
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:3:in `<top (required)>'
    from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/parser11.rb:13:in `<class:Parser>'
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/parser11.rb:11:in `<module:Grammar>'
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/parser11.rb:5:in `<top (required)>'
    from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql.rb:95:in `rescue in execute'
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql.rb:76:in `execute'
    from /usr/local/bundle/gems/sparql-client-3.2.1/lib/sparql/client.rb:332:in `query'
    from bug.rb:3:in `<main>'
/usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:94:in `<module:Terminals>': end pattern with unmatched parenthesis: /ABS|ADD|ADJUST|ALL|ASC|ASK|AS|AVG|BASE|BINDINGS|BIND (RegexpError)
                 |BNODE|BOUND|BY|CEIL|CLEAR|COALESCE|CONCAT
                 |CONSTRUCT|CONTAINS|COPY|COUNT|CREATE|DATATYPE|DAY
                 |DEFAULT|DELETE(?m-ix:(?:\s|(?:#[^\n\r]*))+)DATA|DELETE(?m-ix:(?:\s|(?:#[^\n\r]*))+)WHERE|DELETE
                 |DESCRIBE|DESC|DISTINCT|DROP|ENCODE_FOR_URI|EXISTS
                 |FILTER|FLOOR|FROM|GRAPH|GROUP_CONCAT|GROUP|HAVING
                 |HOURS|IF|INSERT(?m-ix:(?:\s|(?:#[^\n\r]*))+)DATA|INSERT|INTO|IN|IRI
                 |LANGMATCHES|LANGTAG|LANG|LCASE|LIMIT|LOAD
                 |MAX|MD5|MINUS|MINUTES|MIN|MONTH|MOVE
                 |NAMED|NOT|NOW|OFFSET|OPTIONAL
                 |ORDER|PREFIX|RAND|REDUCED|REGEX|REPLACE|ROUND|SAMPLE|SECONDS
                 |SELECT|SEPARATOR|SERVICE
                 |SHA1|SHA224|SHA256|SHA384|SHA512|SILENT
                 |STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|STRUUID|SUBSTR|STR|SUM
                 |TIMEZONE|TO|TZ|UCASE|UNDEF|UNION|URI|USING|UUID|VALUES
                 |WHERE|WITH|YEAR
                 |isBLANK|isIRI|isURI|isLITERAL|isNUMERIC|sameTerm
                 |isTRIPLE|TRIPLE|SUBJECT|PREDICATE|OBJECT
                 |true
                 |false
                 |<<|>>
                 |\{\||\|\}
                 |&&|!=|!|<=|>=|\^\^|\|\||[\(\),.;\[\]\{\}\+\-=<>\?\^\|\*\/a]
              /mix
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:4:in `<module:Grammar>'
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/terminals11.rb:3:in `<top (required)>'
    from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/parser11.rb:13:in `<class:Parser>'
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/parser11.rb:11:in `<module:Grammar>'
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql/grammar/parser11.rb:5:in `<top (required)>'
    from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from <internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql.rb:36:in `parse'
    from /usr/local/bundle/gems/sparql-3.2.4/lib/sparql.rb:77:in `execute'
    from /usr/local/bundle/gems/sparql-client-3.2.1/lib/sparql/client.rb:332:in `query'
    from bug.rb:3:in `<main>'
gkellogg commented 1 year ago

Odd error, since although complicated, the regex does appear to have balanced parentheses. It's a bit challenging for me to work on, as I have been unable to get 3.2 installed on my M2 Mac due to a compilation error. I'll see what i can do, though.

white-gecko commented 1 year ago

There has been some changes to the regex system in ruby 3.2 (https://www.ruby-lang.org/en/news/2022/12/25/ruby-3-2-0-released/) so it could be related to that.

I only came across the issue since the docker base image was updated. -- Diese Nachricht wurde von meinem Android-Gerät mit K-9 Mail gesendet.

gkellogg commented 1 year ago

Simplified the regular expression. Released in 3.2.5.