mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-05 19:27:58 +02:00
100 lines
2.9 KiB
ObjectPascal
100 lines
2.9 KiB
ObjectPascal
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.
|
|
|