# File sql-serialize.rb, line 661
  def sql_select_from_id (dbi, assoc_id)
    sql = "SELECT * FROM " + sql_quote_name("sql_ids") + " WHERE "
    sql << sql_quote_name("id") << " = " << assoc_id.to_s

    obj = nil
    # only one row will match but select_one does not work with all DBDs

    dbi.select_all(sql) { |row|
      classname = row["class"].dup
      classname.untaint
      sql = "SELECT * FROM " + sql_quote_name(classname) + " WHERE "
      sql << sql_quote_name("sql_assoc_id") << " = " << assoc_id.to_s

      case (classname)
      when "Boolean"
        dbi.select_all(sql) { |row|
          obj = row["val"] == sql_true ? true : false
        }
      when "Bignum"
        dbi.select_all(sql) { |row|
          obj = row["val"].to_i
        }
      when "Fixnum"
        dbi.select_all(sql) { |row|
          obj = row["val"].to_i
        }
      when "Float"
        dbi.select_all(sql) { |row|
          obj = row["val"].to_f
        }
      when "Exception"
        dbi.select_all(sql) { |row|
          obj = instance_eval(row["type"] + ".new")
          obj.set_backtrace = row["backtrace"].split("\n")
        }
      when "File"
        dbi.select_all(sql) { |row|
          obj = File.new(row["path"], row["mode"])
          obj.pos = row["pos"]
        }
      when "String"
        dbi.select_all(sql) { |row|
          obj = row["val"].to_s
        }
      else
        obj = instance_eval(classname + ".new")
        
        columns = Hash.new
        dbi.columns(obj.type.name.sub(/#<Module .*?>::/, "")).each { |column|
          columns[column.name] = column.type_name
        }
        
        dbi.execute(sql) { |stm|
          stm.fetch_hash.each_pair { |key,val|
            next if val.nil?
            key = key.dup # this should unfreeze them

            val = val.dup
            key.untaint
            val.untaint
            obj.sql_set_typecast_value(columns[key],key,val)
          }
        }
      end
    }
    return obj
  end