@@ -139,47 +139,38 @@ def create_connection(self):
139139 raise  ConnectionError (* e .args ) from  e 
140140
141141 def  query_table_schema (self , path : DbPath ) ->  Dict [str , tuple ]:
142+  # Databricks has INFORMATION_SCHEMA only for Databricks Runtime, not for Databricks SQL. 
143+  # https://docs.databricks.com/spark/latest/spark-sql/language-manual/information-schema/columns.html 
144+  # So, to obtain information about schema, we should use another approach. 
145+ 
142146 conn  =  self .create_connection ()
143-  table_schema  =  {}
144147
145-  try :
146-  table_schema  =  super ().query_table_schema (path )
147-  except :
148-  logging .warning ("Failed to get schema from information_schema, falling back to legacy approach." )
149- 
150-  if  not  table_schema :
151-  # This legacy approach can cause bugs. e.g. VARCHAR(255) -> VARCHAR(255) 
152-  # and not the expected VARCHAR 
153- 
154-  # I don't think we'll fall back to this approach, but if so, see above 
155-  catalog , schema , table  =  self ._normalize_table_path (path )
156-  with  conn .cursor () as  cursor :
157-  cursor .columns (catalog_name = catalog , schema_name = schema , table_name = table )
158-  try :
159-  rows  =  cursor .fetchall ()
160-  finally :
161-  conn .close ()
162-  if  not  rows :
163-  raise  RuntimeError (f"{ self .name }  : Table '{ '.' .join (path )}  ' does not exist, or has no columns" )
164- 
165-  table_schema  =  {r .COLUMN_NAME : (r .COLUMN_NAME , r .TYPE_NAME , r .DECIMAL_DIGITS , None , None ) for  r  in  rows }
166-  assert  len (table_schema ) ==  len (rows )
167-  return  table_schema 
168-  else :
169-  return  table_schema 
170- 
171-  def  select_table_schema (self , path : DbPath ) ->  str :
172-  """Provide SQL for selecting the table schema as (name, type, date_prec, num_prec)""" 
173-  database , schema , name  =  self ._normalize_table_path (path )
174-  info_schema_path  =  ["information_schema" , "columns" ]
175-  if  database :
176-  info_schema_path .insert (0 , database )
177- 
178-  return  (
179-  "SELECT column_name, data_type, datetime_precision, numeric_precision, numeric_scale " 
180-  f"FROM { '.' .join (info_schema_path )}   " 
181-  f"WHERE table_name = '{ name }  ' AND table_schema = '{ schema }  '" 
182-  )
148+  catalog , schema , table  =  self ._normalize_table_path (path )
149+  with  conn .cursor () as  cursor :
150+  cursor .columns (catalog_name = catalog , schema_name = schema , table_name = table )
151+  try :
152+  rows  =  cursor .fetchall ()
153+  finally :
154+  conn .close ()
155+  if  not  rows :
156+  raise  RuntimeError (f"{ self .name }  : Table '{ '.' .join (path )}  ' does not exist, or has no columns" )
157+ 
158+  d  =  {r .COLUMN_NAME : (r .COLUMN_NAME , r .TYPE_NAME , r .DECIMAL_DIGITS , None , None ) for  r  in  rows }
159+  assert  len (d ) ==  len (rows )
160+  return  d 
161+ 
162+  # def select_table_schema(self, path: DbPath) -> str: 
163+  # """Provide SQL for selecting the table schema as (name, type, date_prec, num_prec)""" 
164+  # database, schema, name = self._normalize_table_path(path) 
165+  # info_schema_path = ["information_schema", "columns"] 
166+  # if database: 
167+  # info_schema_path.insert(0, database) 
168+ 
169+  # return ( 
170+  # "SELECT column_name, data_type, datetime_precision, numeric_precision, numeric_scale " 
171+  # f"FROM {'.'.join(info_schema_path)} " 
172+  # f"WHERE table_name = '{name}' AND table_schema = '{schema}'" 
173+  # ) 
183174
184175 def  _process_table_schema (
185176 self , path : DbPath , raw_schema : Dict [str , tuple ], filter_columns : Sequence [str ], where : str  =  None 
0 commit comments