mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-10 09:49:27 +02:00
* New property TSQLConnection.FieldNameQuoteChars, these chars (start- and
end -quote) are used around field-names. Parameter-names are always quoted using double-quotes, since they are replaced by sqldb for all systems which don't use double-quotes as fieldnamequotechars. Bug #12275. git-svn-id: trunk@15229 -
This commit is contained in:
parent
e01e4e5719
commit
cb92994356
@ -162,7 +162,8 @@ constructor TIBConnection.Create(AOwner : TComponent);
|
||||
|
||||
begin
|
||||
inherited;
|
||||
FConnOptions := FConnOptions + [sqSupportParams] + [sqEscapeRepeat] + [sqQuoteFieldnames];
|
||||
FConnOptions := FConnOptions + [sqSupportParams] + [sqEscapeRepeat];
|
||||
FieldNameQuoteChars:=DoubleQuotes;
|
||||
FBLobSegmentSize := 80;
|
||||
FDialect := -1;
|
||||
FDBDialect := -1;
|
||||
|
@ -927,9 +927,11 @@ begin
|
||||
end;
|
||||
|
||||
constructor TConnectionName.Create(AOwner: TComponent);
|
||||
const SingleBackQoutes: TQuoteChars = ('`','`');
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
FConnOptions := FConnOptions + [sqEscapeRepeat] + [sqEscapeSlash];
|
||||
FieldNameQuoteChars:=SingleBackQoutes;
|
||||
FMySQL := Nil;
|
||||
end;
|
||||
|
||||
|
@ -125,7 +125,8 @@ constructor TPQConnection.Create(AOwner : TComponent);
|
||||
|
||||
begin
|
||||
inherited;
|
||||
FConnOptions := FConnOptions + [sqSupportParams] + [sqEscapeRepeat] + [sqEscapeSlash] + [sqQuoteFieldnames];
|
||||
FConnOptions := FConnOptions + [sqSupportParams] + [sqEscapeRepeat] + [sqEscapeSlash];
|
||||
FieldNameQuoteChars:=DoubleQuotes;
|
||||
end;
|
||||
|
||||
procedure TPQConnection.CreateDB;
|
||||
|
@ -23,7 +23,7 @@ interface
|
||||
uses SysUtils, Classes, DB, bufdataset, sqlscript;
|
||||
|
||||
type TSchemaType = (stNoSchema, stTables, stSysTables, stProcedures, stColumns, stProcedureParams, stIndexes, stPackages);
|
||||
TConnOption = (sqSupportParams,sqEscapeSlash,sqEscapeRepeat,sqQuoteFieldnames);
|
||||
TConnOption = (sqSupportParams,sqEscapeSlash,sqEscapeRepeat);
|
||||
TConnOptions= set of TConnOption;
|
||||
|
||||
TRowsCount = LargeInt;
|
||||
@ -53,9 +53,13 @@ type
|
||||
FSchemaType : TSchemaType;
|
||||
end;
|
||||
|
||||
type TQuoteChars = array[0..1] of char;
|
||||
|
||||
const
|
||||
StatementTokens : Array[TStatementType] of string = ('(none)', 'select',
|
||||
SingleQuotes : TQuoteChars = ('''','''');
|
||||
DoubleQuotes : TQuoteChars = ('"','"');
|
||||
|
||||
StatementTokens : Array[TStatementType] of string = ('(none)', 'select',
|
||||
'insert', 'update', 'delete',
|
||||
'create', 'get', 'put', 'execute',
|
||||
'start','commit','rollback', '?'
|
||||
@ -72,14 +76,13 @@ type
|
||||
procedure Update; override;
|
||||
end;
|
||||
|
||||
|
||||
{ TSQLConnection }
|
||||
type
|
||||
|
||||
{ TSQLConnection }
|
||||
|
||||
TSQLConnection = class (TDatabase)
|
||||
private
|
||||
FFieldNameQuoteChars : TQuoteChars;
|
||||
FPassword : string;
|
||||
FTransaction : TSQLTransaction;
|
||||
FUserName : string;
|
||||
@ -126,6 +129,7 @@ type
|
||||
property port: cardinal read GetPort write Setport;
|
||||
public
|
||||
property Handle: Pointer read GetHandle;
|
||||
property FieldNameQuoteChars: TQuoteChars read FFieldNameQuoteChars write FFieldNameQuoteChars;
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
procedure StartTransaction; override;
|
||||
@ -619,6 +623,7 @@ constructor TSQLConnection.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
FSQLServerFormatSettings.DecimalSeparator:='.';
|
||||
FFieldNameQuoteChars:=DoubleQuotes;
|
||||
end;
|
||||
|
||||
procedure TSQLConnection.GetTableNames(List: TStrings; SystemTables: Boolean);
|
||||
@ -1399,7 +1404,7 @@ end;
|
||||
|
||||
Procedure TCustomSQLQuery.ApplyRecUpdate(UpdateKind : TUpdateKind);
|
||||
|
||||
var FieldNamesQuoteChar : string;
|
||||
var FieldNamesQuoteChars : TQuoteChars;
|
||||
|
||||
procedure InitialiseModifyQuery(var qry : TCustomSQLQuery; aSQL: String);
|
||||
|
||||
@ -1420,7 +1425,7 @@ var FieldNamesQuoteChar : string;
|
||||
if (pfInKey in Fields[x].ProviderFlags) or
|
||||
((FUpdateMode = upWhereAll) and (pfInWhere in Fields[x].ProviderFlags)) or
|
||||
((FUpdateMode = UpWhereChanged) and (pfInWhere in Fields[x].ProviderFlags) and (fields[x].value <> fields[x].oldvalue)) then
|
||||
sql_where := sql_where + '(' + FieldNamesQuoteChar + fields[x].FieldName + FieldNamesQuoteChar + '= :' + FieldNamesQuoteChar + 'OLD_' + fields[x].FieldName + FieldNamesQuoteChar +') and ';
|
||||
sql_where := sql_where + '(' + FieldNamesQuoteChars[0] + fields[x].FieldName + FieldNamesQuoteChars[1] + '= :"' + 'OLD_' + fields[x].FieldName + '") and ';
|
||||
end;
|
||||
|
||||
function ModifyRecQuery : string;
|
||||
@ -1437,7 +1442,7 @@ var FieldNamesQuoteChar : string;
|
||||
UpdateWherePart(sql_where,x);
|
||||
|
||||
if (pfInUpdate in Fields[x].ProviderFlags) then
|
||||
sql_set := sql_set +FieldNamesQuoteChar + fields[x].FieldName + FieldNamesQuoteChar +'=:' + FieldNamesQuoteChar + fields[x].FieldName + FieldNamesQuoteChar + ',';
|
||||
sql_set := sql_set +FieldNamesQuoteChars[0] + fields[x].FieldName + FieldNamesQuoteChars[1] +'=:"' + fields[x].FieldName + '",';
|
||||
end;
|
||||
|
||||
if length(sql_set) = 0 then DatabaseErrorFmt(sNoUpdateFields,['update'],self);
|
||||
@ -1461,8 +1466,8 @@ var FieldNamesQuoteChar : string;
|
||||
begin
|
||||
if (not fields[x].IsNull) and (pfInUpdate in Fields[x].ProviderFlags) then
|
||||
begin
|
||||
sql_fields := sql_fields + FieldNamesQuoteChar + fields[x].FieldName + FieldNamesQuoteChar + ',';
|
||||
sql_values := sql_values + ':' + FieldNamesQuoteChar + fields[x].FieldName + FieldNamesQuoteChar +',';
|
||||
sql_fields := sql_fields + FieldNamesQuoteChars[0] + fields[x].FieldName + FieldNamesQuoteChars[1] + ',';
|
||||
sql_values := sql_values + ':"' + fields[x].FieldName + '",';
|
||||
end;
|
||||
end;
|
||||
if length(sql_fields) = 0 then DatabaseErrorFmt(sNoUpdateFields,['insert'],self);
|
||||
@ -1493,10 +1498,7 @@ var qry : TCustomSQLQuery;
|
||||
Fld : TField;
|
||||
|
||||
begin
|
||||
if sqQuoteFieldnames in TSQLConnection(DataBase).ConnOptions then
|
||||
FieldNamesQuoteChar := '"'
|
||||
else
|
||||
FieldNamesQuoteChar := '';
|
||||
FieldNamesQuoteChars := TSQLConnection(DataBase).FieldNameQuoteChars;
|
||||
|
||||
case UpdateKind of
|
||||
ukModify : begin
|
||||
|
@ -716,7 +716,8 @@ end;
|
||||
constructor TSQLite3Connection.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
FConnOptions := FConnOptions + [sqEscapeRepeat] + [sqEscapeSlash] + [sqQuoteFieldnames];
|
||||
FConnOptions := FConnOptions + [sqEscapeRepeat] + [sqEscapeSlash];
|
||||
FieldNameQuoteChars:=DoubleQuotes;
|
||||
end;
|
||||
|
||||
procedure TSQLite3Connection.UpdateIndexDefs(IndexDefs: TIndexDefs; TableName: string);
|
||||
|
@ -28,8 +28,6 @@ type
|
||||
procedure RunTest; override;
|
||||
published
|
||||
procedure TestEmptyUpdateQuery; // bug 13654
|
||||
procedure TestClearUpdateableStatus;
|
||||
procedure TestReadOnlyParseSQL; // bug 9254
|
||||
procedure TestParseJoins; // bug 10148
|
||||
procedure TestDoubleFieldNames; // bug 8457
|
||||
procedure TestParseUnion; // bug 8442
|
||||
@ -46,7 +44,6 @@ type
|
||||
procedure TestBug9744;
|
||||
procedure TestCrossStringDateParam;
|
||||
procedure TestGetFieldNames;
|
||||
procedure TestGetTables;
|
||||
procedure TestUpdateIndexDefs;
|
||||
procedure TestSetBlobAsMemoParam;
|
||||
procedure TestSetBlobAsBlobParam;
|
||||
@ -94,6 +91,9 @@ type
|
||||
// SchemaType tests
|
||||
procedure TestTableNames;
|
||||
procedure TestFieldNames;
|
||||
procedure TestClearUpdateableStatus;
|
||||
procedure TestReadOnlyParseSQL; // bug 9254
|
||||
procedure TestGetTables;
|
||||
end;
|
||||
|
||||
implementation
|
||||
@ -1157,7 +1157,7 @@ begin
|
||||
ParseSQL := True;
|
||||
AssertTrue(ParseSQL);
|
||||
AssertFalse(ReadOnly);
|
||||
SQL.Text := 'select * from FPDEV;';
|
||||
SQL.Text := 'select * from FPDEV';
|
||||
open;
|
||||
AssertTrue(ParseSQL);
|
||||
AssertFalse(ReadOnly);
|
||||
@ -1347,12 +1347,12 @@ begin
|
||||
AssertEquals(-1,query.RowsAffected);
|
||||
Connection.ExecuteDirect('create table FPDEV2 ( ' +
|
||||
' ID INT NOT NULL , ' +
|
||||
' "NAME-TEST" VARCHAR(250), ' +
|
||||
' '+Connection.FieldNameQuoteChars[0]+'NAME-TEST'+Connection.FieldNameQuoteChars[1]+' VARCHAR(250), ' +
|
||||
' PRIMARY KEY (ID) ' +
|
||||
') ');
|
||||
// Firebird/Interbase need a commit after a DDL statement. Not necessary for the other connections
|
||||
TSQLDBConnector(DBConnector).Transaction.CommitRetaining;
|
||||
Connection.ExecuteDirect('insert into FPDEV2(ID,"NAME-TEST") values (1,''test1'')');
|
||||
Connection.ExecuteDirect('insert into FPDEV2(ID,'+Connection.FieldNameQuoteChars[0]+'NAME-TEST'+Connection.FieldNameQuoteChars[1]+') values (1,''test1'')');
|
||||
Query.SQL.Text := 'select * from FPDEV2';
|
||||
Query.Open;
|
||||
AssertEquals(1,Query.FieldByName('ID').AsInteger);
|
||||
|
Loading…
Reference in New Issue
Block a user