Jelajahi Sumber

* Example from Fajar Khairil demonstrating the use of the SQLParser components (bug id 26141)

git-svn-id: trunk@27760 -
michael 11 tahun lalu
induk
melakukan
708ca37a02
2 mengubah file dengan 100 tambahan dan 0 penghapusan
  1. 1 0
      .gitattributes
  2. 99 0
      packages/fcl-db/examples/sqlparser.pp

+ 1 - 0
.gitattributes

@@ -2008,6 +2008,7 @@ packages/fcl-db/examples/loadlibdemo.lpi svneol=native#text/plain
 packages/fcl-db/examples/loadlibdemo.pp svneol=native#text/plain
 packages/fcl-db/examples/loadlibdemo.pp svneol=native#text/plain
 packages/fcl-db/examples/pqeventstest.pp svneol=native#text/plain
 packages/fcl-db/examples/pqeventstest.pp svneol=native#text/plain
 packages/fcl-db/examples/sqlite3loadlib.lpr svneol=native#text/plain
 packages/fcl-db/examples/sqlite3loadlib.lpr svneol=native#text/plain
+packages/fcl-db/examples/sqlparser.pp svneol=native#text/plain
 packages/fcl-db/fpmake.pp svneol=native#text/plain
 packages/fcl-db/fpmake.pp svneol=native#text/plain
 packages/fcl-db/src/Dataset.txt svneol=native#text/plain
 packages/fcl-db/src/Dataset.txt svneol=native#text/plain
 packages/fcl-db/src/README.txt svneol=native#text/plain
 packages/fcl-db/src/README.txt svneol=native#text/plain

+ 99 - 0
packages/fcl-db/examples/sqlparser.pp

@@ -0,0 +1,99 @@
+program sqlparser;
+
+{**
+ * example usage of fpc TSqlParser
+ *
+ * @author : Fajar Khairil
+*}
+
+
+{$mode objfpc}{$H+}
+
+uses
+  Classes, fpsqlparser, fpsqltree;
+  
+var
+  parser : TSQLParser;
+  aInput: TStringStream;
+  source: TSQLSelectStatement;
+  QExpresion: TSQLBinaryExpression;
+  stmtSelect: TSQLSelectStatement;
+  lField: TSQLTableFieldDef;
+  lTable: TSQLSimpleTableReference;
+  lWhere: TSQLBinaryExpression;
+  leftValue: TSQLIdentifierName;
+  rightValue: TSQLIntegerLiteral;
+  
+begin
+  aInput := TStringStream.Create('SELECT name,age FROM PERSON WHERE id = 5');
+  parser := TSQLParser.Create(aInput);
+  try
+    source := TSQLSelectStatement(parser.Parse);
+
+    //TABLES AND FIELDS
+    Writeln('Tables : ',source.Tables[0].GetAsSQL([]));
+    Writeln('Fields : ',source.Fields[0].GetAsSQL([])+','+source.Fields[1].GetAsSQL([]) );
+
+    //WHERE CLAUSE
+    QExpresion := TSQLBinaryExpression(source.Where);
+    WriteLn('Where Expr Operation : ', QExpresion.Operation );
+    WriteLn('Where Expr Left : ', QExpresion.Left.GetAsSQL([]) );
+    WriteLn('Where Expr Right : ', QExpresion.Right.GetAsSQL([]) );
+    WriteLn('-----------PARSING DONE-----------');
+    WriteLn();
+
+
+    WriteLn('----------Reversing From Tree To Sql Statement ----------');
+    stmtSelect := TSQLSelectStatement.Create(nil);
+
+    //build Table
+    lTable := TSQLSimpleTableReference.Create(stmtSelect);
+    stmtSelect.Tables.add(lTable);
+    lTable.ObjectName := TSQLIdentifierName.Create(lTable);
+    lTable.ObjectName.Name:= 'persons';
+    lTable.AliasName := TSQLIdentifierName.Create(lTable);
+    lTable.AliasName.Name:= 'p';
+
+    //Build Fields
+    lField := TSQLTableFieldDef.Create(stmtSelect);
+    lField.FieldName := TSQLIdentifierName.Create(lField);
+    lField.FieldName.Name:= lTable.AliasName.Name+'.name';
+    stmtSelect.Fields.Add(lField);
+
+    lField := TSQLTableFieldDef.Create(stmtSelect);
+    lField.FieldName := TSQLIdentifierName.Create(lField);
+    lField.FieldName.Name:= lTable.AliasName.Name+'.age';
+    stmtSelect.Fields.Add(lField);
+    //end Build Fields
+
+    //Where Expression
+    lWhere := TSQLBinaryExpression.Create(stmtSelect);
+    stmtSelect.Where := lWhere;
+    lWhere.Operation:= boEQ;
+
+    //left side of BinaryExpression
+    lWhere.Left := TSQLIdentifierExpression.Create(lWhere);
+    leftValue := TSQLIdentifierName.Create(lWhere.left);
+    TSQLIdentifierExpression(lWhere.Left).Identifier :=  leftValue;
+    leftValue.Name:= lTable.AliasName.Name+'.id';
+
+    //right side of BinaryExpression
+    lWhere.right := TSQLLiteralExpression.Create(lWhere);
+    rightValue := TSQLIntegerLiteral.Create(lWhere.right);
+    TSQLLiteralExpression(lWhere.right).Literal := rightValue;
+    rightValue.Value:= 5;
+    //end Where Expression
+
+    //kick!!
+    WriteLn( stmtSelect.GetAsSQL([sfoDoubleQuotes,sfoBackQuoteIdentifier]) );
+
+    WriteLn('-----------Reverse DONE-----------');
+    WriteLn();
+  finally
+    stmtSelect.Free;
+    source.free;
+    aInput.Free;
+    parser.Free;
+  end;
+end.
+