(declare (ignore database))
(if args
(format nil "CHAR(~A)" (car args))
- "VARCHAR"))
+ "VARCHAR"))
+
+(defmethod database-get-type-specifier ((type (eql 'tinyint)) args database
+ (db-type (eql :postgresql)))
+ (declare (ignore args database))
+ "INT2")
+
+(defmethod database-get-type-specifier ((type (eql 'smallint)) args database
+ (db-type (eql :postgresql)))
+ (declare (ignore args database))
+ "INT2")
(defmethod database-get-type-specifier ((type (eql 'wall-time)) args database
(db-type (eql :postgresql)))
(declare (ignore args database))
"TIMESTAMP WITHOUT TIME ZONE")
+(defmethod database-get-type-specifier ((type (eql 'number)) args database
+ (db-type (eql :postgresql)))
+ (declare (ignore database db-type))
+ (cond
+ ((and (consp args) (= (length args) 2))
+ (format nil "NUMERIC(~D,~D)" (first args) (second args)))
+ ((and (consp args) (= (length args) 1))
+ (format nil "NUMERIC(~D)" (first args)))
+ (t
+ "NUMERIC")))
;;; Backend functions
(result
(mapcar #'car
(database-query
- (format nil "SELECT attname FROM pg_class,pg_attribute WHERE pg_class.oid=attrelid AND relname='~A'~A"
+ (format nil "SELECT attname FROM pg_class,pg_attribute WHERE pg_class.oid=attrelid AND attisdropped = FALSE AND relname='~A'~A"
(string-downcase table)
owner-clause)
database nil nil))))
(parse-integer
(caar
(database-query
- (concatenate 'string "SELECT LAST_VALUE ('" sequence-name "')")
+ (concatenate 'string "SELECT LAST_VALUE FROM " sequence-name)
database nil nil)))))
(defun postgresql-database-list (connection-spec type)
(defmethod database-list (connection-spec (type (eql :postgresql-socket)))
(postgresql-database-list connection-spec type))
-
+#+nil
(defmethod database-describe-table ((database generic-postgresql-database) table)
+ ;; MTP: LIST-ATTRIBUTE-TYPES currently executes separate queries for
+ ;; each attribute. It would be more efficient to have a single SQL
+ ;; query return the type data for all attributes. This code is
+ ;; retained as an example of how to do this for PostgreSQL.
(database-query
(format nil "select a.attname, t.typname
from pg_class c, pg_attribute a, pg_type t
(result-types :initarg :result-types :reader result-types)))
(defun clsql-type->postgresql-type (type)
- (case type
- (:string "VARCHAR")
- ((:int :integer) "INT4")
- (:short "INT2")
- ((:number :numeric :float) "NUMERIC")
- (:bigint "INT8")))
+ (cond
+ ((in type :int :integer) "INT4")
+ ((in type :short) "INT2")
+ ((in type :bigint) "INT8")
+ ((in type :float :double :number) "NUMERIC")
+ ((and (consp type) (in (car type) :char :varchar)) "VARCHAR")
+ (t
+ (error 'sql-user-error
+ :message
+ (format nil "Unknown clsql type ~A." type)))))
(defun prepared-sql-to-postgresql-sql (sql)
;; FIXME: Convert #\? to "$n". Don't convert within strings