@@ -11,10 +11,11 @@ import Foundation
1111import OSLog
1212import TableProPluginKit
1313
14- // MySQL/MariaDB field flag constants
15- private let mysqlBinaryFlag : UInt = 0x0080 // 128
16- private let mysqlEnumFlag : UInt = 0x0100 // 256
17- private let mysqlSetFlag : UInt = 0x0800 // 2048
14+ // MySQL/MariaDB field flag and charset constants
15+ private let mysqlBinaryFlag : UInt = 0x0080
16+ private let mysqlEnumFlag : UInt = 0x0100
17+ private let mysqlSetFlag : UInt = 0x0800
18+ private let mysqlBinaryCharset : UInt32 = 63
1819
1920private let logger = Logger ( subsystem: " com.TablePro " , category: " MariaDBPluginConnection " )
2021
@@ -72,13 +73,27 @@ struct MySQLSSLConfig {
7273
7374// MARK: - Type Mapping
7475
75- func mysqlTypeToString( _ type: UInt32 , length: UInt , flags: UInt ) -> String {
76+ func mysqlTypeToString( _ fieldPtr: UnsafePointer < MYSQL_FIELD > ) -> String {
77+ let field = fieldPtr. pointee
78+ let flags = UInt ( field. flags)
79+ let length = field. length
80+
81+ // MariaDB extended metadata: detect JSON stored as LONGTEXT (best-effort)
82+ var attr = MARIADB_CONST_STRING ( )
83+ if mariadb_field_attr ( & attr, fieldPtr, MARIADB_FIELD_ATTR_FORMAT_NAME) == 0 ,
84+ let str = attr. str, attr. length > 0 ,
85+ String ( cString: str) == " json " {
86+ return " JSON "
87+ }
88+
7689 if ( flags & mysqlEnumFlag) != 0 { return " ENUM " }
7790 if ( flags & mysqlSetFlag) != 0 { return " SET " }
7891
79- let isBinary = ( flags & mysqlBinaryFlag) != 0
92+ // Binary flag alone is insufficient — MariaDB sets it on text columns with
93+ // binary collation (e.g. utf8mb4_bin for JSON). Only charset 63 is truly binary.
94+ let isBinary = ( flags & mysqlBinaryFlag) != 0 && field. charsetnr == mysqlBinaryCharset
8095
81- switch type {
96+ switch field . type. rawValue {
8297 case 0 : return " DECIMAL "
8398 case 1 : return " TINYINT "
8499 case 2 : return " SMALLINT "
@@ -444,7 +459,7 @@ final class MariaDBPluginConnection: @unchecked Sendable {
444459 if ( fieldFlags & mysqlEnumFlag) != 0 { fieldType = 247 }
445460 if ( fieldFlags & mysqlSetFlag) != 0 { fieldType = 248 }
446461 columnTypes. append ( fieldType)
447- columnTypeNames. append ( mysqlTypeToString ( fieldType , length : field . length , flags : fieldFlags ) )
462+ columnTypeNames. append ( mysqlTypeToString ( fields + i ) )
448463 }
449464 }
450465
@@ -749,7 +764,7 @@ final class MariaDBPluginConnection: @unchecked Sendable {
749764 if ( fieldFlags & mysqlEnumFlag) != 0 { fieldType = 247 }
750765 if ( fieldFlags & mysqlSetFlag) != 0 { fieldType = 248 }
751766 columnTypes. append ( fieldType)
752- columnTypeNames. append ( mysqlTypeToString ( fieldType , length : field . length , flags : fieldFlags ) )
767+ columnTypeNames. append ( mysqlTypeToString ( fields + i ) )
753768 }
754769 }
755770
0 commit comments