* 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:
joost 2010-05-05 17:30:26 +00:00
parent e01e4e5719
commit cb92994356
6 changed files with 29 additions and 22 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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);