| <html xmlns:o="urn:schemas-microsoft-com:office:office" |
| xmlns:w="urn:schemas-microsoft-com:office:word" |
| xmlns="http://www.w3.org/TR/REC-html40"> |
| |
| <head> |
| <meta http-equiv=Content-Type content="text/html; charset=windows-1252"> |
| <meta name=ProgId content=Word.Document> |
| <meta name=Generator content="Microsoft Word 10"> |
| <meta name=Originator content="Microsoft Word 10"> |
| <title>SQL Query Parser User documentation</title> |
| <!--[if gte mso 9]><xml> |
| <o:DocumentProperties> |
| <o:Author>Rupesh</o:Author> |
| <o:Template>Normal</o:Template> |
| <o:LastAuthor>Rupesh</o:LastAuthor> |
| <o:Revision>19</o:Revision> |
| <o:TotalTime>494</o:TotalTime> |
| <o:Created>2005-12-15T21:14:00Z</o:Created> |
| <o:LastSaved>2005-12-21T00:23:00Z</o:LastSaved> |
| <o:Pages>1</o:Pages> |
| <o:Words>1438</o:Words> |
| <o:Characters>8202</o:Characters> |
| <o:Company>IBM</o:Company> |
| <o:Lines>68</o:Lines> |
| <o:Paragraphs>19</o:Paragraphs> |
| <o:CharactersWithSpaces>9621</o:CharactersWithSpaces> |
| <o:Version>10.6735</o:Version> |
| </o:DocumentProperties> |
| </xml><![endif]--><!--[if gte mso 9]><xml> |
| <w:WordDocument> |
| <w:SpellingState>Clean</w:SpellingState> |
| <w:Compatibility> |
| <w:BreakWrappedTables/> |
| <w:SnapToGridInCell/> |
| <w:WrapTextWithPunct/> |
| <w:UseAsianBreakRules/> |
| </w:Compatibility> |
| <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> |
| </w:WordDocument> |
| </xml><![endif]--> |
| <style> |
| <!-- |
| /* Font Definitions */ |
| @font-face |
| {font-family:Helv; |
| panose-1:2 11 6 4 2 2 2 3 2 4; |
| mso-font-charset:0; |
| mso-generic-font-family:swiss; |
| mso-font-format:other; |
| mso-font-pitch:variable; |
| mso-font-signature:3 0 0 0 1 0;} |
| /* Style Definitions */ |
| p.MsoNormal, li.MsoNormal, div.MsoNormal |
| {mso-style-parent:""; |
| margin:0in; |
| margin-bottom:.0001pt; |
| mso-pagination:widow-orphan; |
| font-size:12.0pt; |
| font-family:"Times New Roman"; |
| mso-fareast-font-family:"Times New Roman";} |
| h1 |
| {mso-style-next:Normal; |
| margin-top:12.0pt; |
| margin-right:0in; |
| margin-bottom:3.0pt; |
| margin-left:0in; |
| mso-pagination:widow-orphan; |
| page-break-after:avoid; |
| mso-outline-level:1; |
| font-size:16.0pt; |
| font-family:Arial; |
| mso-font-kerning:16.0pt;} |
| h2 |
| {mso-style-next:Normal; |
| margin-top:12.0pt; |
| margin-right:0in; |
| margin-bottom:3.0pt; |
| margin-left:0in; |
| mso-pagination:widow-orphan; |
| page-break-after:avoid; |
| mso-outline-level:2; |
| font-size:14.0pt; |
| font-family:Arial; |
| font-style:italic;} |
| h3 |
| {mso-style-next:Normal; |
| margin-top:12.0pt; |
| margin-right:0in; |
| margin-bottom:3.0pt; |
| margin-left:0in; |
| mso-pagination:widow-orphan; |
| page-break-after:avoid; |
| mso-outline-level:3; |
| font-size:13.0pt; |
| font-family:Arial;} |
| span.SpellE |
| {mso-style-name:""; |
| mso-spl-e:yes;} |
| @page Section1 |
| {size:8.5in 11.0in; |
| margin:1.0in 1.25in 1.0in 1.25in; |
| mso-header-margin:.5in; |
| mso-footer-margin:.5in; |
| mso-paper-source:0;} |
| div.Section1 |
| {page:Section1;} |
| /* List Definitions */ |
| @list l0 |
| {mso-list-id:115029601; |
| mso-list-template-ids:-752958178;} |
| @list l0:level1 |
| {mso-level-start-at:2; |
| mso-level-text:%1; |
| mso-level-tab-stop:20.25pt; |
| mso-level-number-position:left; |
| margin-left:20.25pt; |
| text-indent:-20.25pt;} |
| @list l0:level2 |
| {mso-level-text:"%1\.%2"; |
| mso-level-tab-stop:.5in; |
| mso-level-number-position:left; |
| margin-left:.5in; |
| text-indent:-.5in;} |
| @list l0:level3 |
| {mso-level-text:"%1\.%2\.%3"; |
| mso-level-tab-stop:.5in; |
| mso-level-number-position:left; |
| margin-left:.5in; |
| text-indent:-.5in;} |
| @list l0:level4 |
| {mso-level-text:"%1\.%2\.%3\.%4"; |
| mso-level-tab-stop:.75in; |
| mso-level-number-position:left; |
| margin-left:.75in; |
| text-indent:-.75in;} |
| @list l0:level5 |
| {mso-level-text:"%1\.%2\.%3\.%4\.%5"; |
| mso-level-tab-stop:1.0in; |
| mso-level-number-position:left; |
| margin-left:1.0in; |
| text-indent:-1.0in;} |
| @list l0:level6 |
| {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6"; |
| mso-level-tab-stop:1.0in; |
| mso-level-number-position:left; |
| margin-left:1.0in; |
| text-indent:-1.0in;} |
| @list l0:level7 |
| {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7"; |
| mso-level-tab-stop:1.25in; |
| mso-level-number-position:left; |
| margin-left:1.25in; |
| text-indent:-1.25in;} |
| @list l0:level8 |
| {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8"; |
| mso-level-tab-stop:1.25in; |
| mso-level-number-position:left; |
| margin-left:1.25in; |
| text-indent:-1.25in;} |
| @list l0:level9 |
| {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8\.%9"; |
| mso-level-tab-stop:1.5in; |
| mso-level-number-position:left; |
| margin-left:1.5in; |
| text-indent:-1.5in;} |
| @list l1 |
| {mso-list-id:646207190; |
| mso-list-type:hybrid; |
| mso-list-template-ids:-749714554 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} |
| @list l1:level1 |
| {mso-level-number-format:bullet; |
| mso-level-text:\F0B7; |
| mso-level-tab-stop:.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in; |
| font-family:Symbol;} |
| @list l1:level2 |
| {mso-level-tab-stop:1.0in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l1:level3 |
| {mso-level-tab-stop:1.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l1:level4 |
| {mso-level-tab-stop:2.0in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l1:level5 |
| {mso-level-tab-stop:2.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l1:level6 |
| {mso-level-tab-stop:3.0in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l1:level7 |
| {mso-level-tab-stop:3.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l1:level8 |
| {mso-level-tab-stop:4.0in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l1:level9 |
| {mso-level-tab-stop:4.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l2 |
| {mso-list-id:1169910884; |
| mso-list-template-ids:739684470;} |
| @list l2:level1 |
| {mso-level-number-format:bullet; |
| mso-level-text:\F0B7; |
| mso-level-tab-stop:.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in; |
| mso-ansi-font-size:10.0pt; |
| font-family:Symbol;} |
| @list l3 |
| {mso-list-id:2068717998; |
| mso-list-type:hybrid; |
| mso-list-template-ids:2141609920 67698703 67698689 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} |
| @list l3:level1 |
| {mso-level-tab-stop:.25in; |
| mso-level-number-position:left; |
| margin-left:.25in; |
| text-indent:-.25in;} |
| @list l3:level2 |
| {mso-level-number-format:bullet; |
| mso-level-text:\F0B7; |
| mso-level-tab-stop:1.0in; |
| mso-level-number-position:left; |
| text-indent:-.25in; |
| font-family:Symbol;} |
| @list l3:level3 |
| {mso-level-tab-stop:1.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l3:level4 |
| {mso-level-tab-stop:2.0in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l3:level5 |
| {mso-level-tab-stop:2.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l3:level6 |
| {mso-level-tab-stop:3.0in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l3:level7 |
| {mso-level-tab-stop:3.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l3:level8 |
| {mso-level-tab-stop:4.0in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| @list l3:level9 |
| {mso-level-tab-stop:4.5in; |
| mso-level-number-position:left; |
| text-indent:-.25in;} |
| ol |
| {margin-bottom:0in;} |
| ul |
| {margin-bottom:0in;} |
| --> |
| </style> |
| <!--[if gte mso 10]> |
| <style> |
| /* Style Definitions */ |
| table.MsoNormalTable |
| {mso-style-name:"Table Normal"; |
| mso-tstyle-rowband-size:0; |
| mso-tstyle-colband-size:0; |
| mso-style-noshow:yes; |
| mso-style-parent:""; |
| mso-padding-alt:0in 5.4pt 0in 5.4pt; |
| mso-para-margin:0in; |
| mso-para-margin-bottom:.0001pt; |
| mso-pagination:widow-orphan; |
| font-size:10.0pt; |
| font-family:"Times New Roman";} |
| table.MsoTableGrid |
| {mso-style-name:"Table Grid"; |
| mso-tstyle-rowband-size:0; |
| mso-tstyle-colband-size:0; |
| border:solid windowtext 1.0pt; |
| mso-border-alt:solid windowtext .5pt; |
| mso-padding-alt:0in 5.4pt 0in 5.4pt; |
| mso-border-insideh:.5pt solid windowtext; |
| mso-border-insidev:.5pt solid windowtext; |
| mso-para-margin:0in; |
| mso-para-margin-bottom:.0001pt; |
| mso-pagination:widow-orphan; |
| font-size:10.0pt; |
| font-family:"Times New Roman";} |
| </style> |
| <![endif]--> |
| </head> |
| |
| <body lang=EN-US style='tab-interval:.5in'> |
| |
| <div class=Section1> |
| |
| <h1 style='margin-left:.25in;text-align:justify;text-indent:-.25in;mso-list: |
| l3 level1 lfo2;tab-stops:list 0in .25in'><![if !supportLists]><span |
| style='mso-fareast-font-family:Arial'><span style='mso-list:Ignore'>1.<span |
| style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>Introduction</h1> |
| |
| <p class=MsoNormal style='text-align:justify'>The SQL Query Parser (also |
| referred to as parser in this document) is a generated parser. LPG (<span |
| class=SpellE>Lexer</span> Parser Generator) is used to generate the parser, |
| which, based on a set of grammar rules, generates the Parser and <span |
| class=SpellE>Lexer</span> source code in Java. The focus of this document is on |
| how to use the generated parser.</p> |
| |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| |
| <p class=MsoNormal style='text-align:justify'>The parser takes SQL DML |
| statements as input and creates instances of SQL Query Model classes if the SQL |
| is syntactically valid. In addition to the syntactic validation, the parser can |
| also perform a semantic validation. The parser is extensible to support vendor |
| specific dialects and custom source generation.</p> |
| |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| |
| <h1 style='margin-left:.25in;text-align:justify;text-indent:-.25in;mso-list: |
| l3 level1 lfo2;tab-stops:list 0in .25in'><![if !supportLists]><span |
| style='mso-fareast-font-family:Arial'><span style='mso-list:Ignore'>2.<span |
| style='font:7.0pt "Times New Roman"'> </span></span></span><![endif]>Usage</h1> |
| |
| <p class=MsoNormal>// imports needed</p> |
| |
| <p class=MsoNormal>import <span class=SpellE>java.util.ArrayList</span>;</p> |
| |
| <p class=MsoNormal>import <span class=SpellE>java.util.Iterator</span>;</p> |
| |
| <p class=MsoNormal>import java.util.List;</p> |
| |
| <p class=MsoNormal><o:p> </o:p></p> |
| |
| <p class=MsoNormal>import org.eclipse.datatools.modelbase.sql.datatypes.DataType;</p> |
| |
| <p class=MsoNormal>import |
| org.eclipse.datatools.modelbase.sql.query.QueryStatement;</p> |
| |
| <p class=MsoNormal>import |
| org.eclipse.datatools.modelbase.sql.query.ValueExpressionColumn;</p> |
| |
| <p class=MsoNormal>import |
| org.eclipse.datatools.modelbase.sql.query.helper.StatementHelper;</p> |
| |
| <p class=MsoNormal>import |
| org.eclipse.datatools.modelbase.sql.query.util.SQLQuerySourceFormat;</p> |
| |
| <p class=MsoNormal>import org.eclipse.datatools.modelbase.sql.schema.Database;</p> |
| |
| <p class=MsoNormal>import |
| org.eclipse.datatools.sqltools.parsers.sql.SQLParseErrorInfo;</p> |
| |
| <p class=MsoNormal>import org.eclipse.datatools.sqltools.parsers.sql.SQLParserException;</p> |
| |
| <p class=MsoNormal>import |
| org.eclipse.datatools.sqltools.parsers.sql.SQLParserInternalException;</p> |
| |
| <p class=MsoNormal>import |
| org.eclipse.datatools.sqltools.parsers.sql.postparse.PostParseProcessor;</p> |
| |
| <p class=MsoNormal>import |
| org.eclipse.datatools.sqltools.parsers.sql.query.SQLQueryParseResult;</p> |
| |
| <p class=MsoNormal>import |
| org.eclipse.datatools.sqltools.parsers.sql.query.SQLQueryParserManager;</p> |
| |
| <p class=MsoNormal>import |
| org.eclipse.datatools.sqltools.parsers.sql.query.SQLQueryParserManagerProvider;</p> |
| |
| <p class=MsoNormal>import |
| org.eclipse.datatools.sqltools.parsers.sql.query.postparse.DataTypeResolver;</p> |
| |
| <p class=MsoNormal>import |
| org.eclipse.datatools.sqltools.parsers.sql.query.postparse.TableReferenceResolver;</p> |
| |
| <p class=MsoNormal><o:p> </o:p></p> |
| |
| <h2 style='margin-left:.5in;text-indent:-.5in;mso-list:l0 level2 lfo4; |
| tab-stops:list .5in'><![if !supportLists]><span style='mso-fareast-font-family: |
| Arial;font-style:normal;mso-bidi-font-style:italic'><span style='mso-list:Ignore'>2.1<span |
| style='font:7.0pt "Times New Roman"'> |
| </span></span></span><![endif]><span style='font-style:normal;mso-bidi-font-style: |
| italic'>Invoking the parser <o:p></o:p></span></h2> |
| |
| <p class=MsoNormal>This code snippet below shows how to use the parser without |
| using the semantic validation (known as post parse processing) and source formatting. |
| </p> |
| |
| <p class=MsoNormal><o:p> </o:p></p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:2'> </span>try |
| {</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>// |
| Create an instance the Parser Manager</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>// |
| SQLQueryParserManagerProvider.getInstance().getParserManager</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>// |
| returns the best compliant SQLQueryParserManager</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>// |
| supporting the SQL dialect of the database described by the given</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>// |
| database product information. In the code below null is passed for both the |
| database and version</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>// |
| in which case a generic parser is returned</p> |
| |
| <p class=MsoNormal><o:p> </o:p></p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>SQLQueryParserManager |
| parserManager = SQLQueryParserManagerProvider</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:5'> </span>.getInstance().getParserManager(null, |
| null);</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>//Sample |
| query</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>String |
| sql = "SELECT * FROM TABLE1";</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>//Parse</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>SQLQueryParseResult |
| parseResult = parserManager.parseQuery(sql);</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>// |
| Get the Query Model object from the result </p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>QueryStatement |
| resultObject = parseResult.getQueryStatement();</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>// |
| Get the SQL text </p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>String |
| parsedSQL = resultObject.getSQL();</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>System.out.println(parsedSQL);</p> |
| |
| <p class=MsoNormal><o:p> </o:p></p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:2'> </span>} |
| catch (SQLParserException spe) {</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>// |
| handle the syntax error</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>System.out.println(spe.getMessage());</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>List |
| syntacticErrors = spe.getErrorInfoList();</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>Iterator |
| itr = syntacticErrors.iterator();</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>while |
| (itr.hasNext()) {</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:4'> </span>SQLParseErrorInfo |
| errorInfo = (SQLParseErrorInfo) itr.next();</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:4'> </span>// |
| Example usage of the SQLParseErrorInfo object</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:4'> </span>// |
| the error message</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:4'> </span>String |
| errorMessage = errorInfo.getParserErrorMessage();</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:4'> </span>// |
| the line numbers of error</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:4'> </span>int |
| errorLine = errorInfo.getLineNumberStart();</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:4'> </span>int |
| errorColumn = errorInfo.getColumnNumberStart();</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>}</p> |
| |
| <p class=MsoNormal><o:p> </o:p></p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:2'> </span>} |
| catch (SQLParserInternalException spie) {</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span>// |
| handle the exception</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:3'> </span><span |
| lang=DE style='mso-ansi-language:DE'>System.out.println(spie.getMessage());<o:p></o:p></span></p> |
| |
| <p class=MsoNormal><span lang=DE style='mso-ansi-language:DE'><span |
| style='mso-tab-count:2'> </span></span>}</p> |
| |
| <h2 style='margin-left:.5in;text-indent:-.5in;mso-list:l0 level2 lfo4; |
| tab-stops:list .5in'><![if !supportLists]><span style='mso-fareast-font-family: |
| Arial;font-style:normal;mso-bidi-font-style:italic'><span style='mso-list:Ignore'>2.2<span |
| style='font:7.0pt "Times New Roman"'> |
| </span></span></span><![endif]><span style='font-style:normal;mso-bidi-font-style: |
| italic'>Getting a parser manager for a specific vendor<o:p></o:p></span></h2> |
| |
| <p class=MsoNormal>The recommended way is to instantiate a parser based on the |
| database vendor information so as to handle vendor specific variations of SQL. |
| The following code snippet shows how to create the parser based on the vendor |
| information</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:2'> </span>// |
| TODO initialize the variable db with the </p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:2'> </span>// |
| org.eclipse.wst.rdb.internal.models.sql.schema.Database intance obtained from </p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:2'> </span>// |
| the database connection</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:2'> </span>// |
| Database db;</p> |
| |
| <p class=MsoNormal><o:p> </o:p></p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:2'> </span>// |
| TODO<span style='mso-spacerun:yes'> </span>get the vendorname and version |
| after the variable is initialized </p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:2'> </span>// |
| String dbName = db.getVendor();</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:2'> </span>// |
| String dbVersion = db.getVersion();</p> |
| |
| <p class=MsoNormal><o:p> </o:p></p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:2'> </span>// |
| get the best matching parser manager depending on what parser extension are |
| plugged in</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:2'> </span>SQLQueryParserManager |
| parserManager = SQLQueryParserManagerProvider</p> |
| |
| <p class=MsoNormal><span style='mso-tab-count:4'> </span>.getInstance().getParserManager(dbName, |
| dbVersion);</p> |
| |
| <p class=MsoNormal><o:p> </o:p></p> |
| |
| <p class=MsoNormal>If not matching parser is found, then the generic parser is |
| retuned.</p> |
| |
| <p class=MsoNormal><o:p> </o:p></p> |
| |
| <h2 style='margin-left:.5in;text-indent:-.5in;mso-list:l0 level2 lfo4; |
| tab-stops:list .5in'><![if !supportLists]><span style='mso-fareast-font-family: |
| Arial;font-style:normal;mso-bidi-font-style:italic'><span style='mso-list:Ignore'>2.3<span |
| style='font:7.0pt "Times New Roman"'> |
| </span></span></span><![endif]><span style='font-style:normal;mso-bidi-font-style: |
| italic'>Using post parse processing and source formatting<o:p></o:p></span></h2> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'>The semantic validation of the parsed |
| SQL is done in a step called the Post Parse Processing. <o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'>At present there are two types of |
| semantic validations are supported. <o:p></o:p></span></p> |
| |
| <ul style='margin-top:0in' type=disc> |
| <li class=MsoNormal style='color:black;text-align:justify;line-height:12.0pt; |
| mso-list:l1 level1 lfo7;tab-stops:list .5in;mso-layout-grid-align:none; |
| text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv'>Table reference resolving verifying that the |
| tables referred to in the SQL are existing in the database<o:p></o:p></span></li> |
| <li class=MsoNormal style='color:black;text-align:justify;line-height:12.0pt; |
| mso-list:l1 level1 lfo7;tab-stops:list .5in;mso-layout-grid-align:none; |
| text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv'>Data type resolving verifying the data types |
| of the result columns<o:p></o:p></span></li> |
| </ul> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'>Appending the schema name to the |
| database object (for example schema1.table1) is optional, when the parser |
| generates the SQL after a successful parse.<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'>The following code snippet shows how to |
| configure post parse processors and the source formatting for the parser.<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| TODO initialize the variable db with the <o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| org.eclipse.wst.rdb.internal.models.sql.schema.Database intance obtained from <o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| the database connection<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| initialize the variable currentSchemaName to be the schema name<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| Database <span class=SpellE>database</span>;<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| String currentSchemaName;<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| String dbName = db.getVendor();<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| String dbVersion = db.getVersion();<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>String |
| sql = "SELECT * FROM TABLE1";<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| create the post parse processors, maybe wrapped in <span class=SpellE>createPostParseProcessorList</span>()<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span><span |
| class=SpellE>PostParseProcessor</span> <span class=SpellE>tableRefResolver</span> |
| = new <span class=SpellE>TableReferenceResolver</span>(<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>database, |
| currentSchemaName);<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span><span |
| class=SpellE>PostParseProcessor</span> <span class=SpellE>dataTypeResolver</span> |
| = new <span class=SpellE>DataTypeResolver</span>();<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| ordering is important for post parse processing! first we need to fill<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| in the database information for table references and column types<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>List |
| <span class=SpellE>postParseProcessors</span> = new <span class=SpellE>ArrayList</span>();<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span><span |
| class=SpellE>postParseProcessors.add</span>(0, <span class=SpellE>tableRefResolver</span>);<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span><span |
| class=SpellE>postParseProcessors.add</span>(1, <span class=SpellE>dataTypeResolver</span>);<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| get the SQL source format options and set at least the current schema<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| that is <span class=SpellE>omited</span> but implicit for any unqualified table |
| references<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| important for later resolving of table references!<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span><span |
| class=SpellE>SQLQuerySourceFormat</span> <span class=SpellE>sourceFormat</span> |
| = <span class=SpellE>SQLQuerySourceFormat</span><o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>.<span |
| class=SpellE>copyDefaultFormat</span>();<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span><span |
| class=SpellE>sourceFormat.setOmitSchema</span>(currentSchemaName);<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>SQLQueryParserManager |
| parserManager = SQLQueryParserManagerProvider<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>.getInstance().getParserManager(dbName, |
| dbVersion);<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span><span |
| class=SpellE>parserManager.configParser</span>(<span class=SpellE>sourceFormat</span>, |
| <span class=SpellE>postParseProcessors</span>);<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>// |
| parse the SQL statement<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>try |
| {<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:3'> </span>SQLQueryParseResult |
| parseResult = parserManager.parseQuery(sql);<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:3'> </span>List |
| <span class=SpellE>semanticErrors</span> = <span class=SpellE>parseResult.getErrorList</span>();<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:3'> </span>Iterator |
| itr = <span class=SpellE>semanticErrors.iterator</span>();<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:3'> </span>while |
| (itr.hasNext()) {<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>SQLParseErrorInfo |
| errorInfo = (SQLParseErrorInfo) itr.next();<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>// |
| the error message<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>String |
| errorMessage = errorInfo.getParserErrorMessage();<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>// |
| the line numbers of error<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>int |
| errorLine = errorInfo.getLineNumberStart();<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>int |
| errorColumn = errorInfo.getColumnNumberStart();<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>// |
| Error processing for specific errors<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>String |
| <span class=SpellE>errorCode</span> = <span class=SpellE>errorInfo.getErrorCode</span>();<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>if |
| (<span class=SpellE>TableReferenceResolver.ERROR_CODE_TABLE_UNRESOLVED</span><o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:6'> </span>.equals(<span |
| class=SpellE>errorCode</span>)) {<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:5'> </span>// |
| table not found<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>} |
| else if (<span class=SpellE>TableReferenceResolver.ERROR_CODE_COLUMN_UNRESOLVED</span><o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:6'> </span>.equals(<span |
| class=SpellE>errorCode</span>)<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:6'> </span>|| |
| <span class=SpellE>TableReferenceResolver.ERROR_CODE_NONEXISTENT_COLUMN</span><o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:8'> </span>.equals(<span |
| class=SpellE>errorCode</span>)) {<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:5'> </span>// |
| column not found<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:4'> </span>}<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:3'> </span>}<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>} |
| catch (SQLParserException spe) {<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:3'> </span>// |
| handle the syntax exception<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:3'> </span>System.out.println(spe.getMessage());<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:2'> </span>} |
| catch (SQLParserInternalException spie) {<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:3'> </span>// |
| handle the exception<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><span style='mso-tab-count:3'> </span></span><span |
| lang=DE style='font-size:10.0pt;font-family:Helv;mso-bidi-font-family:Helv; |
| color:black;mso-ansi-language:DE'>System.out.println(spie.getMessage());<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span lang=DE style='font-size:10.0pt;font-family: |
| Helv;mso-bidi-font-family:Helv;color:black;mso-ansi-language:DE'><span |
| style='mso-tab-count:2'> </span></span><span |
| style='font-size:10.0pt;font-family:Helv;mso-bidi-font-family:Helv;color:black'>}<o:p></o:p></span></p> |
| |
| <p class=MsoNormal style='text-align:justify;line-height:12.0pt;mso-layout-grid-align: |
| none;text-autospace:none'><span style='font-size:10.0pt;font-family:Helv; |
| mso-bidi-font-family:Helv;color:black'><o:p> </o:p></span></p> |
| |
| <h2 style='margin-left:.5in;text-indent:-.5in;mso-list:l0 level2 lfo4; |
| tab-stops:list .5in'><![if !supportLists]><span style='mso-fareast-font-family: |
| Arial;font-style:normal;mso-bidi-font-style:italic'><span style='mso-list:Ignore'>2.4<span |
| style='font:7.0pt "Times New Roman"'> |
| </span></span></span><![endif]><span style='font-style:normal;mso-bidi-font-style: |
| italic'>Getting result columns<o:p></o:p></span></h2> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:2'> </span>// |
| the effective result columns of a <span class=SpellE>QuerySelectStatement</span> |
| are the columns that are returned by</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:2'> </span>// |
| the select statement</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:2'> </span>// |
| e.g.:<span style='mso-spacerun:yes'> </span>SELECT SUBQRY.* FROM (SELECT |
| COL1, COL2 FROM TABLEA) AS SUBQRY</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:2'> </span>// |
| QueryStatement <span class=SpellE>queryStmt</span> = |
| parserManager.parseQuery("SELECT SUBQRY.* FROM (SELECT COL1, COL2 FROM |
| TABLEA) AS SUBQRY");</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:2'> </span>//<span |
| style='mso-tab-count:1'> </span> get the List of effective result |
| columns with data types </p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:2'> </span>List |
| <span class=SpellE>columnExprList</span> = <span class=SpellE>StatementHelper</span></p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:4'> </span>.<span |
| class=SpellE>getEffectivesResultColumns</span>(<span class=SpellE>queryStmt</span>);</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:2'> </span>Iterator |
| <span class=SpellE>columnIt</span> = <span class=SpellE>columnExprList.iterator</span>();</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:2'> </span>while |
| (<span class=SpellE>columnIt.hasNext</span>()) {</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:3'> </span><span |
| class=SpellE>ValueExpressionColumn</span> <span class=SpellE>colExpr</span> = (<span |
| class=SpellE>ValueExpressionColumn</span>) <span class=SpellE>columnIt</span></p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:5'> </span>.next();</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:3'> </span><span |
| class=SpellE>DataType</span> <span class=SpellE>dataType</span> = <span |
| class=SpellE>colExpr.getDataType</span>();</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:3'> </span>System.out.println("effective |
| result column: " + <span class=SpellE>colExpr.getName</span>()</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:5'> </span>+ |
| " with data type: " + <span class=SpellE>dataType.getPrimitiveType</span>());</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:2'> </span>}</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:2'> </span>// |
| expected Output of example "SELECT SUBQRY.* FROM (SELECT COL1, COL2 FROM |
| TABLEA) AS SUBQRY":</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:2'> </span>//<span |
| style='mso-spacerun:yes'> </span>effective result column: COL1 with data |
| type: VARCHAR</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:2'> </span>//<span |
| style='mso-spacerun:yes'> </span>effective result column: COL2 with data |
| type: VARCHAR</p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p> |
| |
| <p class=MsoNormal style='margin-left:.5in'><span style='mso-tab-count:1'> </span>}</p> |
| |
| <p class=MsoNormal><o:p> </o:p></p> |
| |
| <h1 style='margin-left:20.25pt;text-align:justify;text-indent:-20.25pt; |
| mso-list:l0 level1 lfo4;tab-stops:list 20.25pt'><![if !supportLists]><span |
| style='mso-fareast-font-family:Arial'><span style='mso-list:Ignore'>3<span |
| style='font:7.0pt "Times New Roman"'> |
| </span></span></span><![endif]>Parser <span class=SpellE>Plugins</span></h1> |
| |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| |
| <table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0 width=645 |
| style='width:483.4pt;border-collapse:collapse;border:none;mso-border-alt:solid windowtext .5pt; |
| mso-yfti-tbllook:480;mso-padding-alt:0in 5.4pt 0in 5.4pt;mso-border-insideh: |
| .5pt solid windowtext;mso-border-insidev:.5pt solid windowtext'> |
| <tr style='mso-yfti-irow:0;height:20.45pt'> |
| <td width=393 valign=top style='width:294.5pt;border:solid windowtext 1.0pt; |
| mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt;height:20.45pt'> |
| <p class=MsoNormal style='text-align:justify'><span class=SpellE><b |
| style='mso-bidi-font-weight:normal'>Plugins</b></span><b style='mso-bidi-font-weight: |
| normal'><o:p></o:p></b></p> |
| </td> |
| <td width=252 valign=top style='width:188.9pt;border:solid windowtext 1.0pt; |
| border-left:none;mso-border-left-alt:solid windowtext .5pt;mso-border-alt: |
| solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt;height:20.45pt'> |
| <p class=MsoNormal style='text-align:justify'><b style='mso-bidi-font-weight: |
| normal'>Description<o:p></o:p></b></p> |
| </td> |
| </tr> |
| <tr style='mso-yfti-irow:1;height:62.4pt'> |
| <td width=393 valign=top style='width:294.5pt;border:solid windowtext 1.0pt; |
| border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt; |
| padding:0in 5.4pt 0in 5.4pt;height:62.4pt'> |
| <p class=MsoNormal style='text-align:justify'><span class=SpellE>org.eclipse.datatools.sqltools.parsers.sql.lexer</span></p> |
| <p class=MsoNormal style='text-align:justify'>org.eclipse.datatools.sqltools.parsers.sql.lexer.db2</p> |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| </td> |
| <td width=252 valign=top style='width:188.9pt;border-top:none;border-left: |
| none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; |
| mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt; |
| mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt;height:62.4pt'> |
| <p class=MsoNormal style='text-align:justify'>SQL <span class=SpellE>Lexer</span> |
| and<span style='mso-spacerun:yes'> </span><span class=SpellE>lexer</span> to |
| support DB2 specific keywords</p> |
| </td> |
| </tr> |
| <tr style='mso-yfti-irow:2;height:20.45pt'> |
| <td width=393 valign=top style='width:294.5pt;border:solid windowtext 1.0pt; |
| border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt; |
| padding:0in 5.4pt 0in 5.4pt;height:20.45pt'> |
| <p class=MsoNormal style='text-align:justify'><span class=SpellE>org.eclipse.datatools.sqltools.parsers.sql</span></p> |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| </td> |
| <td width=252 valign=top style='width:188.9pt;border-top:none;border-left: |
| none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; |
| mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt; |
| mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt;height:20.45pt'> |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| </td> |
| </tr> |
| <tr style='mso-yfti-irow:3;height:21.55pt'> |
| <td width=393 valign=top style='width:294.5pt;border:solid windowtext 1.0pt; |
| border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt; |
| padding:0in 5.4pt 0in 5.4pt;height:21.55pt'> |
| <p class=MsoNormal style='text-align:justify'><span class=SpellE>org.eclipse.datatools.sqltools.parsers.sql.query</span></p> |
| <p class=MsoNormal style='text-align:justify'>org.eclipse.datatools.sqltools.parsers.sql.query.db2</p> |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| </td> |
| <td width=252 valign=top style='width:188.9pt;border-top:none;border-left: |
| none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; |
| mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt; |
| mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt;height:21.55pt'> |
| <p class=MsoNormal style='text-align:justify'>DML Parser and extension<span |
| style='mso-spacerun:yes'> </span>to support SQL dialect specific to DB2</p> |
| </td> |
| </tr> |
| <tr style='mso-yfti-irow:4;height:21.55pt'> |
| <td width=393 valign=top style='width:294.5pt;border:solid windowtext 1.0pt; |
| border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt; |
| padding:0in 5.4pt 0in 5.4pt;height:21.55pt'> |
| <p class=MsoNormal style='text-align:justify'><span class=SpellE>org.eclipse.datatools.sqltools.parsers.sql.xml.query</span></p> |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| </td> |
| <td width=252 valign=top style='width:188.9pt;border-top:none;border-left: |
| none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; |
| mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt; |
| mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt;height:21.55pt'> |
| <p class=MsoNormal style='text-align:justify'>Parser for SQL/XML:</p> |
| </td> |
| </tr> |
| <tr style='mso-yfti-irow:5;mso-yfti-lastrow:yes;height:21.55pt'> |
| <td width=393 valign=top style='width:294.5pt;border:solid windowtext 1.0pt; |
| border-top:none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt; |
| padding:0in 5.4pt 0in 5.4pt;height:21.55pt'> |
| <p class=MsoNormal style='text-align:justify'>org.eclipse.datatools.sqltools.parsers.sql.query.db2.test</p> |
| <p class=MsoNormal style='text-align:justify'><span class=SpellE>org.eclipse.datatools.sqltools.parsers.sql.query.test</span></p> |
| <p class=MsoNormal style='text-align:justify'><span class=SpellE>org.eclipse.datatools.sqltools.parsers.sql.test</span></p> |
| <p class=MsoNormal style='text-align:justify'><span class=SpellE>org.eclipse.datatools.sqltools.parsers.sql.xml.query.test</span></p> |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| </td> |
| <td width=252 valign=top style='width:188.9pt;border-top:none;border-left: |
| none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; |
| mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt; |
| mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt;height:21.55pt'> |
| <p class=MsoNormal style='text-align:justify'><span class=SpellE>JUint</span> |
| test cases for the parser</p> |
| </td> |
| </tr> |
| </table> |
| |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| |
| <p class=MsoNormal style='text-align:justify'><o:p> </o:p></p> |
| |
| </div> |
| |
| </body> |
| |
| </html> |