diff --git a/packages/fcl-db/src/sqldb/interbase/ibconnection.pp b/packages/fcl-db/src/sqldb/interbase/ibconnection.pp index 8747e0ea47..f2fb35a694 100644 --- a/packages/fcl-db/src/sqldb/interbase/ibconnection.pp +++ b/packages/fcl-db/src/sqldb/interbase/ibconnection.pp @@ -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; diff --git a/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc b/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc index 067f516c37..2dc230ac8a 100644 --- a/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc +++ b/packages/fcl-db/src/sqldb/mysql/mysqlconn.inc @@ -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; diff --git a/packages/fcl-db/src/sqldb/postgres/pqconnection.pp b/packages/fcl-db/src/sqldb/postgres/pqconnection.pp index 7ed2386d7e..66729cd077 100644 --- a/packages/fcl-db/src/sqldb/postgres/pqconnection.pp +++ b/packages/fcl-db/src/sqldb/postgres/pqconnection.pp @@ -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; diff --git a/packages/fcl-db/src/sqldb/sqldb.pp b/packages/fcl-db/src/sqldb/sqldb.pp index 00c2863694..9884aa711f 100644 --- a/packages/fcl-db/src/sqldb/sqldb.pp +++ b/packages/fcl-db/src/sqldb/sqldb.pp @@ -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 diff --git a/packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp b/packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp index 52988add8b..d260ad03c3 100644 --- a/packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp +++ b/packages/fcl-db/src/sqldb/sqlite/sqlite3conn.pp @@ -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); diff --git a/packages/fcl-db/tests/testfieldtypes.pas b/packages/fcl-db/tests/testfieldtypes.pas index d75cc62839..ce51b473d1 100644 --- a/packages/fcl-db/tests/testfieldtypes.pas +++ b/packages/fcl-db/tests/testfieldtypes.pas @@ -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);