diff --git a/source/dbconnection.pas b/source/dbconnection.pas index 49932d2e..1225d27b 100644 --- a/source/dbconnection.pas +++ b/source/dbconnection.pas @@ -7137,8 +7137,26 @@ end; function TSQLiteQuery.ColIsPrimaryKeyPart(Column: Integer): Boolean; +var + MetaResult: Integer; + TableNm, ColumnNm: String; + DataType, CollSeq: PAnsiChar; + NotNull, PrimaryKey, Autoinc: Integer; begin Result := False; + TableNm := TableName(Column); + ColumnNm := FColumnOrgNames[Column]; + if not TableNm.IsEmpty then begin + MetaResult := FConnection.Lib.sqlite3_table_column_metadata(FConnection.FHandle, + PAnsiChar(Utf8Encode(FConnection.Database)), + PAnsiChar(Utf8Encode(TableNm)), + PAnsiChar(Utf8Encode(ColumnNm)), + DataType, CollSeq, NotNull, PrimaryKey, Autoinc + ); + if MetaResult <> SQLITE_ERROR then begin + Result := PrimaryKey.ToBoolean; + end; + end; end; diff --git a/source/dbstructures.pas b/source/dbstructures.pas index 0b418637..a92e75d6 100644 --- a/source/dbstructures.pas +++ b/source/dbstructures.pas @@ -536,6 +536,10 @@ const sqlite3_column_table_name: function(pStmt: Psqlite3_stmt; N: Integer): PAnsiChar; cdecl; sqlite3_column_origin_name: function(pStmt: Psqlite3_stmt; N: Integer): PAnsiChar; cdecl; sqlite3_next_stmt: function(ppDb: Psqlite3; pStmt: Psqlite3_stmt): Psqlite3_stmt; cdecl; + sqlite3_table_column_metadata: function(ppDb: Psqlite3; + zDbName, zTableName, zColumnName: PAnsiChar; + var pzDataType, pzCollSeq: PAnsiChar; var pNotNull, pPrimaryKey, pAutoinc: Integer + ): Integer; cdecl; private procedure AssignProcedures; override; end; @@ -7949,6 +7953,7 @@ begin AssignProc(@sqlite3_column_table_name, 'sqlite3_column_table_name'); AssignProc(@sqlite3_column_origin_name, 'sqlite3_column_origin_name'); AssignProc(@sqlite3_next_stmt, 'sqlite3_next_stmt'); + AssignProc(@sqlite3_table_column_metadata, 'sqlite3_table_column_metadata'); end;