Announcement

Collapse
No announcement yet.

suche SQL Parser

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • suche SQL Parser

    Hallo,</p>
    <p>ich suche einen SQL-Parser.&nbsp;<br>
    Das was ich bis jetzt getestet und gefunden habe war weniger erfolgreich<br>
    &nbsp;- unter sourceforge steht eine Komponente für Delphi - ist noch zu arg in
    der Entwicklungsphase<br>
    &nbsp;- die unter in der DBcommon-Unit Funktion NextSQLToken - trennt nicht
    sauber im Select die <b><font face="Courier New" size="2">AS</font></b> und <b><font face="Courier New" size="2">functions<br>
    </font></b>&nbsp;- es soll eine SQLparse.dll geben die man &quot;anzapfen
    könnte&quot; - ist aber eine BlackBox für mich, habe auch keine Doku gefunden<br>
    ich muss jeden einzelnen SQL-Block Select, From, Where, OrderBy, etc.
    separieren. <br>
    Dabei muss aus einem <br>
    <font face="Courier" size="1">&nbsp;&nbsp; SELECT ARname, ARname as ArtikelName,
    funcVergleichXYZ (ARname, XYZtext) as Vergleich<br>
    &nbsp;&nbsp; FROM Artikel INNER JOIN XYZTabelle ON Artikel.ARid =
    XYZTabelle.RefARid<br>
    &nbsp;&nbsp; WHERE ARid &gt; 1000<br>
    &nbsp;&nbsp; AND ARnummer = &quot;12345678&quot;<br>
    &nbsp;&nbsp; ORDER BY ARname</font></p>
    <p>folgende Liste/Baum entstehen<br>
    &nbsp;+ SELECT<br>
    &nbsp;&nbsp;&nbsp; - ARname, ARname, ''<br>
    &nbsp;&nbsp;&nbsp; - ARname, ArtikelName, ''<br>
    &nbsp;&nbsp;&nbsp; - funcVergleichXYZ(ARname,XYZtext), Vergleich, Function<br>
    &nbsp;+ FROM<br>
    &nbsp;&nbsp;&nbsp; - Artikel, INNER JOIN, XYZTabelle, ON, Artikel.ARid, =,
    XYZTabelle.RefARid <br>
    &nbsp;+ WHERE<br>
    &nbsp;&nbsp;&nbsp; - WHERE, ARid, &gt;, 1000<br>
    &nbsp;&nbsp;&nbsp; - AND, ARnummer, =, &quot;12345678&quot;<br>
    &nbsp;+ ORDERBY<br>
    &nbsp;&nbsp;&nbsp; - ARname<br>
    </p>
    <p>Wer weiß Rat ?<br>
    &nbsp;<br>
    Gruss und Dank<br>
    &nbsp;&nbsp; Dietmar</p>
    <p>&nbsp;</p>

  • #2
    Hallo Dietmar,

    wenn du den SQL-Parser nicht in nächster Zeit benötigst, dann kann ich dir vielleicht weiterhelfen.
    Ich bin gerade dabei eine kleine relationale Datenbank, die sich nur im Hauptspeicher befindet, zu schreiben. In dem Zuge schreibe ich auch eine SQL-Parser. Das Ganze werde ich dann als Open Source freigeben.
    Der aktuelle Stand des Parsers ist momentan so, dass er von deinem Beispiel alles außer dem INNER JOIN und der Funktion parsen kann. Das mit der Funktion wird wohl in den nächsten Wochen dazu kommen. JOINS sind für die erste Version nicht vorgesehen, was bei einem INNER JOIN aber kein Problem darstellt, da man das auch anders formulieren kann.
    Der Parsebaum fällt allerdings deutlich komplexer aus, als von dir gewünscht, da dieser auch Klammerungen und Rechnungen abbilden können muss.

    Wenn Interesse besteht, dann stelle ich ein kleines Programm zum Download bereit, mit dem man selbst testen kann, was der Parser bereits kann und wie komplex der Parsebaum ist.

    Gruß
    Richar

    Comment


    • #3
      Hallo Richard,<br>
      &nbsp;<br>
      das mit der Zeit ist so ne Sache .. Monate kann ich mir leider nicht erlauben,
      das es für ein Produktivsystem ist das wirklich mit NextSQLToken ausgereizt ist.<br>
      &nbsp;... &quot;&quot;was bei einem INNER JOIN aber kein Problem darstellt, da
      man das auch anders formulieren kann&quot;&quot;<br>
      Ich muss Dir Recht geben wenn wir von DBase und Paradox Tabellen reden. Jedoch
      ist ein INNER JOIN auf einen Datenbankserver so etwas wie die Frage 'welchen
      optimalen Index hole ich mir für die Verknüpfung'. Das bedeutet wenn ich Keys
      auf solche &quot;Verbindungsfelder&quot; lege, dann bekomme ich auch
      Geschwindigkeit. Nicht jeder QueryOptimizer funktioniert so, aber mit dem
      MSSQL-Server habe ich damit gute Erfahrung gemacht. <br>
      ... &quot;&quot;Der Parsebaum fällt allerdings deutlich komplexer aus, als von
      dir gewünscht, da dieser auch Klammerungen und Rechnungen abbilden können
      muss.&quot;&quot;<br>
      Je detailierter umso besser.<br>
      ... &quot;&quot;Wenn Interesse besteht, dann stelle ich ein kleines Programm zum
      Download bereit, mit dem man selbst testen kann, was der Parser bereits kann und
      wie komplex der Parsebaum ist.&quot;&quot;<br>
      Gerne würde ich mir das mal anschauen.<br>
      Im Gegenzuge habe ich natürlich auch nachgeforscht und habe einiges gefunden
      was aber immer noch keine Lösung ist, also folgendes</p>
      <ul>
      <li>- unter <a href="http://www.antlr.org">www.antlr.org</a>
      (Parser/Compiler-Compiler) gibt es ein Script &quot;MS SQL Server 2000
      SELECT statement&quot; von Tomasz Jastrzebski (nett und hilfsbereit) das
      einen Java, c# oder c++ Code erzeugt, wodurch man wirklich für den
      MSSQL-Server ein sehr gutes Ergebnis bekommt. Leider fehlen mir die Mittel
      um <br>
      a) diesen Code in Delphi zu übersetzten und <br>
      b) aus dem Code für Delphi eine COM-Objekt oder DLL-Wrapper zu bauen.</li>
      <li>unter <a href="http://www.devincook.com/goldparser">www.devincook.com/goldparser</a>
      gibt es den &quot;GOLD Parser&quot; auch für Delphi. <br>
      Ein Beispiel für SQL gibt auch. Jedoch Ansi SQL89. Somit kann der Parser
      keine functions, inner joins, subselects, etc..<br>
      Nach denen ihren reden (readme) hat SQL92 über 300 Bausteine bekommen und
      dauert es halt ... </li>
      <li>und dann gibt es noch den QueryBuilder <a href="http://www.ems-hitech.com/querybuilder">www.ems-hitech.com/querybuilder</a>
      die eine Komponenete mit einem Parser enthält. Bin momentan am Testen wie
      man subselects verarbeiten kann wie z.B. <br>
      <font face="Courier New" size="2">&nbsp;&nbsp; SELECT COUNT(*) AS Anzahl<br>
      &nbsp;&nbsp; FROM Einheit INNER JOIN EinheitTyp ON Einheit.eh_ehtID =
      EinheitTyp.ehtID<br>
      &nbsp;&nbsp; WHERE (ehID NOT IN (SELECT ehu_ehID FROM EinheitUmrechnung ))<br>
      &nbsp;&nbsp; AND (EinheitTyp.ehtKurztext &lt;&gt; 'M')<br>
      </font>wird noch nicht richtig aufgelöst, haben damit noch ein Problem</li>
      </ul>
      <p>Gruss und Dank<br>
      &nbsp;&nbsp; Dietmar </p>
      &#10

      Comment


      • #4
        Hallo!<br>
        Einen Parser kann man mit den Tools lexx yacc bison flex auch selber erstellen.<br>
        Unter: http://www.progtools.org/compilers/parserscan.html<br>
        Scheinen einige interessante Links zu sein, die auf solche Tools verweisen. Inwieweit diese Tools dann auch funktionieren weiß ich leider nicht.<br>
        Unter Turbo Pascal kann ich mich ganz dunkel an einen Parser (Lexx/Yacc) erinnern. (Hab aber auf die schnelle keinen Link finden können.<br>
        PS: Ohne passende Literatur wird das aber sehr heftig. Es muß für SQL erstmal eine passende Grammatik erstellt werden!!!<br>
        BYE BERN

        Comment


        • #5
          Hallo Bernd,<br>
          <br>
          &gt; Einen Parser kann man mit den Tools lexx yacc bison flex auch selber
          erstellen.<br>
          &gt;Unter: <a href="http://www.progtools.org/compilers/parserscan.html">http://www.progtools.org/compilers/parserscan.html<br>
          </a>die meisten generieren c oder c++ Code und leider kein Delphi. GOLD Parser
          ist einer der mit Delphi umgehen kann ... aber SQL92 ....<br>
          Der ANTLR den ich oben erwähnt habe, generiert für das ca. 800Zeilen grosse
          SQL Beschreibungs Script über 10000 Zeilen c# Code. Und das c++ File ist über
          500KByte gross. Da der Source generiert wird, sind auch automatisch erstellte
          Variablen vorhanden sowie absolute Sprünge (GOTO) (das Verständnis für den
          Code wird dadurch erheblich erschwert). Eine Konvertierung in Delphi bedeutet
          Zeit ... viel Zeit. <br>
          &gt;Scheinen einige interessante Links zu sein, die auf solche Tools verweisen.
          Inwieweit diese Tools dann auch funktionieren <br>
          &gt;weiß ich leider nicht.<br>
          Teilweise muss man googeln<br>
          &gt;Unter Turbo Pascal kann ich mich ganz dunkel an einen Parser (Lexx/Yacc)
          erinnern. <br>
          &gt;(Hab aber auf die schnelle keinen Link finden können.<br>
          www.musikwissenschaft.uni-mainz.de/~ag/tply <br>
          <a href="http://www.lischke-online.de/DCG.php">www.lischke-online.de/DCG.php</a>
          <br>
          &gt;PS: Ohne passende Literatur wird das aber sehr heftig. <br>
          &gt;Es muß für SQL erstmal eine passende Grammatik erstellt werden!!!<br>
          Du sagst es - das ist dann das nächste Problem<br>
          &nbsp;<br>
          Gruss und Dank<br>
          &nbsp;&nbsp; Dietmar</p>
          &#10

          Comment


          • #6
            >>PS: Ohne passende Literatur wird das aber sehr heftig.
            >>Es muß für SQL erstmal eine passende Grammatik erstellt werden!!!
            >Du sagst es - das ist dann das nächste Problem

            Es geistern einige Grammatiken im Netz herum. Eine die ich mir vor längerer Zeit besorgt habe beherscht keine JOINS.
            Und selbst wenn man eine Grammatik hat, hat man noch lange keinen Parsebaum.
            Da wartet noch einiges an Arbeit auf einen.
            Mit der erwähnten Grammatik habe ich das schon einmal gemacht. Es ist aber ein Horror nach Bugs zu suchen. Wenn man durch den vom Yacc erzeugten Code durchdebuggen muss, verliert man schnell den Überlick und man ist dann zum x-ten mal über die Stelle, die einen interessiert, hinaus geschossen.
            So richtig interessant wird es dann, wen man die Grammatik für seine Zwecke erweitern will. Ruck-Zuck hat man ein paar Shift-Reduce- und Reduce-Reduce-Konflikte erzeugt. Dann dauert es, bis man versteht, wodurch diese Konflikte hervorgerufen werden. Es dauert dann mindestens noch einmal so lange bis man weiß, wie man die Konflikte auflösen kann.
            Aus diesen und noch ein paar anderen Gründen habe ich mich dann entschieden, dass ich meinen SQL-Parser von Hand schreibe.

            Übers Wochenende habe ich noch Funktionen, Subselects und Joins eingebaut.
            Bei den Joins war ich zu faul nach der genauen Definition zu suchen. Für die meisten Fälle sollte es aber funktionieren.
            Der Parser kann aber nur Select. Insert, Update, etc. ist noch Zukunftsmusik.

            Ein entsprechendes Testprogramm kann man sich von <a href="http://www.kasparsoft.de/SqlParserDemo.zip">http://www.kasparsoft.de/SqlParserDemo.zip</a> herunterladen.
            Das Teil ist mit heißer Nadel gestrickt. Es geistern also sicherlich noch etliche Bugs darin herum.

            Gruß
            Richar

            Comment

            Working...
            X