code: def drop_udf(
          self,
          name,
          input_types=None,
          database=None,
          force=False,
          aggregate=False,
      ):
          
          if not input_types:
              if not database:
                  database = self.current_database
              result = self.list_udfs(database=database, like=name)
              if len(result) > 1:
                  if force:
                      for func in result:
                          self._drop_single_function(
                              func.name,
                              func.inputs,
                              database=database,
                              aggregate=aggregate,
                          )
                      return
                  else:
                      raise Exception(
                          "More than one function "
                          + "with {0} found.".format(name)
                          + "Please specify force=True"
                      )
              elif len(result) == 1:
                  func = result.pop()
                  self._drop_single_function(
                      func.name,
                      func.inputs,
                      database=database,
                      aggregate=aggregate,
                  )
                  return
              else:
                  raise Exception("No function found with name {0}".format(name))
          self._drop_single_function(
              name, input_types, database=database, aggregate=aggregate
          )
docs: Drops a UDF
          If only name is given, this will search
          for the relevant UDF and drop it.
          To delete an overloaded UDF, give only a name and force=True
  
          Parameters
          ----------
          name : string
          input_types : list of strings (optional)
          force : boolean, default False Must be set to true to
                  drop overloaded UDFs
          database : string, default None
          aggregate : boolean, default False