📄 abssqlprocessor.pas
字号:
function AllConditionsApplied: Boolean;
// check that there is no INTO clause
function HasInto: Boolean;
end;
////////////////////////////////////////////////////////////////////////////////
//
// TABSSQLUnion
// UNION SQL command
//
////////////////////////////////////////////////////////////////////////////////
TABSSQLUnion = class (TABSSQLCursorCommand)
protected
FRootNode: TABSQueryExprNode; // root node in unions,excepts tree
// parses [ALL]
function ParseAll: Boolean;
// parses [ <corresponding spec> ]
function ParseCorrespondingSpec(var ColumnsList: TStringList): Boolean;
// parses SELECT ...
function ParseQuerySpecification: TABSQueryExprNode;
// parses <query specification> | <table value constructor> | <explicit table>
function ParseSimpleTable: TABSQueryExprNode;
// parses <simple table> |
// <left paren> <non-join query expression> <right paren>
function ParseNonJoinQueryPrimary: TABSQueryExprNode;
// parses <non-join query primary> |
// <query term> INTERSECT [ ALL ] [ <corresponding spec> ] <query primary>
function ParseNonJoinQueryTerm: TABSQueryExprNode;
// parses <non-join query term> |
// <query expression> UNION [ ALL ] [ <corresponding spec> ] <query term> |
// <query expression> EXCEPT [ ALL ] [ <corresponding spec> ] <query term>
function ParseNonJoinQueryExpression: TABSQueryExprNode;
// parses <non-join query expression> | <joined table>
function ParseQueryExpression: TABSQueryExprNode;
// builds AO
function BuildAO(Node: TABSQueryExprNode; RequestLive: Boolean; ParentQueryAO: TABSAO;
ParentCursor: TABSCursor; AllowNotAppliedConditions: Boolean): TABSAO;
public
// creates object
constructor Create(Lexer: TABSLexer; Query: TDataSet);
// destroys object
destructor Destroy; override;
// parses query
procedure Parse; override;
// check if correlated subquery apllied
function AllConditionsApplied: Boolean; override;
// builds AO tree
function BuildAOTree(query: TDataset; RequestLive: Boolean; ParentQueryAO: TABSAO;
ParentCursor: TABSCursor; AllowNotAppliedConditions: Boolean): TABSAO; override;
end;//TABSSQLUnion
////////////////////////////////////////////////////////////////////////////////
//
// TABSSQLInsert
//
////////////////////////////////////////////////////////////////////////////////
TABSSQLInsert = class (TABSSQLCommand)
protected
TableName: string; // Table Name
DatabaseFileName: string;
Password: string; // table password
FieldNames: TStringList;
FieldValues: array of TList;
InternalSelecter: TABSSQLSelect;
protected
procedure ParseValuesList;
public
// creates object
constructor Create(Lexer: TABSLexer; Query: TDataSet);
// destroys object
destructor Destroy; override;
// parses query
procedure Parse; override;
// executes query
procedure ExecSQL(
query: TDataset;
IsRoot,
RequestLive: boolean;
var ReadOnly: boolean;
ParentQueryAO: TABSAO = nil;
ParentCursor: TABSCursor = nil
); override;
end;//TABSSQLInsert
////////////////////////////////////////////////////////////////////////////////
//
// TABSSQLUpdate
//
////////////////////////////////////////////////////////////////////////////////
TABSSQLUpdate = class (TABSSQLCommand)
protected
DatabaseFileName: String; // DB Name
TableName: string; // Table Name
Password: string; // table password
FieldNames: TStringList;
FieldValues: TList;
IsFieldValuesSubquery: Boolean;
FieldValuesSubqueryExpr: TABSExpression;
InternalSelecter: TABSSQLSelect;
FSelectLexer: TABSLexer;
FTablePseudonym: String;
public
// creates object
constructor Create(Lexer: TABSLexer; Query: TDataSet);
// destroys object
destructor Destroy; override;
// parses query
procedure Parse; override;
// executes query
procedure ExecSQL(
query: TDataset;
IsRoot,
RequestLive: boolean;
var ReadOnly: boolean;
ParentQueryAO: TABSAO = nil;
ParentCursor: TABSCursor = nil
); override;
end;//TABSSQLUpdate
////////////////////////////////////////////////////////////////////////////////
//
// TABSSQLDelete
//
////////////////////////////////////////////////////////////////////////////////
TABSSQLDelete = class (TABSSQLCommand)
protected
InternalSelecter: TABSSQLSelect;
TableName: string; // Table Name
FullDelete: boolean;
public
// creates object
constructor Create(Lexer: TABSLexer; Query: TDataSet);
// destroys object
destructor Destroy; override;
// parses query
procedure Parse; override;
// executes query
procedure ExecSQL(
query: TDataset;
IsRoot,
RequestLive: boolean;
var ReadOnly: boolean;
ParentQueryAO: TABSAO = nil;
ParentCursor: TABSCursor = nil
); override;
end;//TABSSQLDelete
////////////////////////////////////////////////////////////////////////////////
//
// TABSDDLTableManipulation
//
////////////////////////////////////////////////////////////////////////////////
// FieldDef element
TSQLFieldDef = class (TObject)
public
FieldName: String; // field name or pseudonym
CreateIfNotExists: Boolean;
// FieldType
newFieldType: Boolean;
FieldType: TABSAdvancedFieldType;
// field length ex: String(255)
newLength: Boolean;
Length: Integer;
// is Requared field (NOT NULL)
newRequired: Boolean;
Required: Boolean;
// Autoinc settings
newAutoincIncrement: Boolean;
AutoincIncrement: Int64;
newAutoincLastValue: Boolean;
AutoincLastValue: Int64;
newAutoincMinValue: Boolean;
AutoincMinValue: Int64;
newAutoincMaxValue: Boolean;
AutoincMaxValue: Int64;
newAutoincCycled: Boolean;
AutoincCycled: Boolean;
// Blob settings
newBlobBlockSize: Boolean;
BlobBlockSize: Integer; // 1..
newBlobCompressionAlgorithm: Boolean;
BlobCompressionAlgorithm: TABSCompressionAlgorithm;// {NONE | ZLIB | BZIP | PPM}
newBlobCompressionMode: Boolean;
BlobCompressionMode: Byte; // {0 .. 9}
//Default Value
newDefaultValue: Boolean;
DefaultValue: TABSVariant;
newMinValue: Boolean;
MinValue: TABSVariant;
newMaxValue: Boolean;
MaxValue: TABSVariant;
newPrimaryKey: Boolean;
PrimaryKey: Boolean;
newUnique: Boolean;
Unique: Boolean;
public
constructor Create;
destructor Destroy; override;
end;
TSQLFieldDefs = class (TObject)
protected
List: TList;
function GetDef(Index: Integer): TSQLFieldDef;
public
constructor Create;
destructor Destroy; override;
function AddCreated: TSQLFieldDef;
function GetCount: Integer;
public
property Items[Index: Integer]: TSQLFieldDef read GetDef; default;
property Count: Integer read GetCount;
end;
TABSIndexField = record
FieldName: string; // field name or pseudonym
desc: boolean; // desc/asc
nocase: boolean; // ncase/case sensitive
end;
TABSIndex = record
IndexName: String;
Unique: Boolean;
Primary: Boolean;
IndexFields: array of TABSIndexField; // Index Fields
end;
TABSDDLTableManipulation = class (TABSSQLCommand)
protected
Password: String; // table password
DatabaseName: String; // DB Name
TableName: String; // Table Name
TableAlias: String; // Table Pseudonym
SQLFieldDefs: TSQLFieldDefs; // SQLFieldDefs
//PrimaryIndexName: String;
//PrimaryKey: TStringList;
//PrimaryKeyFields: array of TABSIndexField;
//UniqueFields: TStringList;
Indexes: array of TABSIndex;
// table element list
procedure ParseTableElementList;
// parse TableName token
procedure ParseTableNameToken;
// Fill table column type into Structure
procedure FillColumnType(var FieldDef:TSQLFieldDef);
// Fill column requared value into Structure
procedure ParseColumnRequared(var FieldDef:TSQLFieldDef);
// parse PASSWORD 'aaa'
procedure ParsePassword;
// parse DEFAULT {const | NULL}
function ParseDefaultValue(var FieldDef:TSQLFieldDef): Boolean;
// parse MINVALUE value
function ParseMinValue(var FieldDef:TSQLFieldDef): Boolean;
// parse MAXVALUE value
function ParseMaxValue(var FieldDef:TSQLFieldDef): Boolean;
// parse fiald ... PRIMARY KEY
function ParseFieldPrimaryKey(var FieldDef:TSQLFieldDef): Boolean;
// parse fiald ... UNIQUE
function ParseFieldUnique(var FieldDef:TSQLFieldDef): Boolean;
// parse Primary Key
function ParsePrimaryKey: boolean;
// parse Index
function ParseIndex: boolean;
// parse Index Field
procedure ParseIndexField(IndexNo: Integer);
// parse Index Fields
procedure ParseIndexFields(IndexNo: Integer);
// go to the Next token and Parse Integer (Int64)
function ParseInteger: Int64;
// Create ABSTable object and fill ABSTable params
procedure CreateInternalABSTable(query: TDataSet; var table: TDataSet;
var db: TObject; FillAdvFieldDefs: Boolean);
// Fill AdvFieldDef
procedure FillAdvFieldDef(AdvFieldDef: TFieldDef; SQLFieldDef: TSQLFieldDef);
// Add Indexes to ABSTable
procedure AddIndexes(T: TDataSet);
// Add Primary Key into ABSTable
//procedure AddPrimaryKey(T: TDataSet);
// Add UNIQUE constraint and index into ABSTable
//procedure AddUnique(T: TDataSet);
// Delete PrimaryKey
procedure DeletePrimaryKey(T: TDataSet);
public
// creates object
constructor Create(Lexer: TABSLexer; Query: TDataSet);
// destroy
destructor Destroy; override;
// parses query
procedure Parse; override;
// executes query
procedure ExecSQL(
query: TDataset;
IsRoot,
RequestLive: boolean;
var ReadOnly: boolean;
ParentQueryAO: TABSAO = nil;
ParentCursor: TABSCursor = nil
); override; abstract;
end;//TABSDDLTableManipulation
////////////////////////////////////////////////////////////////////////////////
//
// TABSDDLCreateTable
//
////////////////////////////////////////////////////////////////////////////////
TABSDDLCreateTable = class (TABSDDLTableManipulation)
private
FCreateIfNotExists: Boolean;
protected
// Create Table
procedure CreateTable(query: TDataSet);
public
// parses query
procedure Parse; override;
// executes query
procedure ExecSQL(
query: TDataset;
IsRoot,
RequestLive: boolean;
var ReadOnly: boolean;
ParentQueryAO: TABSAO = nil;
ParentCursor: TABSCursor = nil
); override;
end;//TABSDDLCreateTable
////////////////////////////////////////////////////////////////////////////////
//
// TABSDDLDropTable
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -