Index: doc/src/sgml/oper.sgml
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/doc/src/sgml/oper.sgml,v
retrieving revision 1.18
diff -u -r1.18 oper.sgml
--- doc/src/sgml/oper.sgml 2000/09/15 20:20:11 1.18
+++ doc/src/sgml/oper.sgml 2000/09/25 07:01:04
@@ -493,9 +493,46 @@
Cube root
||/ 27.0
+
+ &
+ Binary AND
+ 91 & 15
+
+
+ |
+ Binary OR
+ 32 | 3
+
+
+ ^
+ Binary XOR
+ 15 ^ 4
+
+
+ ~
+ Binary NOT
+ ~1
+
+
+ <<
+ Binary shift left
+ 1 << 4
+
+
+ >>
+ Binary shift right
+ 8 >> 2
+
+
+
+ The binary operators work only on fixed-precision integer types,
+ that is, on the int2, int4 and int8. Also note that '^' means XOR
+ on integer types and power on non-integer types.
+
+
Index: src/backend/utils/adt/int.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/utils/adt/int.c,v
retrieving revision 1.42
diff -u -r1.42 int.c
--- src/backend/utils/adt/int.c 2000/08/01 18:29:35 1.42
+++ src/backend/utils/adt/int.c 2000/09/25 07:01:05
@@ -843,3 +843,121 @@
PG_RETURN_INT32((arg1 < arg2) ? arg1 : arg2);
}
+
+/* Binary arithmetics
+ *
+ * int[24]and - returns arg1 & arg2
+ * int[24]or - returns arg1 | arg2
+ * int[24]xor - returns arg1 ^ arg2
+ * int[24]not - returns ~arg1
+ * int[24]shl - returns arg1 << arg2
+ * int[24]shr - returns arg1 >> arg2
+ */
+
+Datum
+int4and(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT32(arg1 & arg2);
+}
+
+Datum
+int4or(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT32(arg1 | arg2);
+}
+
+Datum
+int4xor(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT32(arg1 ^ arg2);
+}
+
+Datum
+int4shl(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT32(arg1 << arg2);
+}
+
+Datum
+int4shr(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT32(arg1 >> arg2);
+}
+
+Datum
+int4not(PG_FUNCTION_ARGS)
+{
+ int32 arg1 = PG_GETARG_INT32(0);
+
+ PG_RETURN_INT32(~arg1);
+}
+
+Datum
+int2and(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_INT16(arg1 & arg2);
+}
+
+Datum
+int2or(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_INT16(arg1 | arg2);
+}
+
+Datum
+int2xor(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int16 arg2 = PG_GETARG_INT16(1);
+
+ PG_RETURN_INT16(arg1 ^ arg2);
+}
+
+Datum
+int2not(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+
+ PG_RETURN_INT16(~arg1);
+}
+
+
+Datum
+int2shl(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT16(arg1 << arg2);
+}
+
+Datum
+int2shr(PG_FUNCTION_ARGS)
+{
+ int16 arg1 = PG_GETARG_INT16(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT16(arg1 >> arg2);
+}
+
Index: src/backend/utils/adt/int8.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/utils/adt/int8.c,v
retrieving revision 1.24
diff -u -r1.24 int8.c
--- src/backend/utils/adt/int8.c 2000/07/28 05:07:41 1.24
+++ src/backend/utils/adt/int8.c 2000/09/25 07:01:06
@@ -591,6 +591,68 @@
PG_RETURN_INT64(val1 / val2);
}
+/* Binary arithmetics
+ *
+ * int8and - returns arg1 & arg2
+ * int8or - returns arg1 | arg2
+ * int8xor - returns arg1 ^ arg2
+ * int8not - returns ~arg1
+ * int8shl - returns arg1 << arg2
+ * int8shr - returns arg1 >> arg2
+ */
+
+Datum
+int8and(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_INT64(arg1 & arg2);
+}
+
+Datum
+int8or(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_INT64(arg1 | arg2);
+}
+
+Datum
+int8xor(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 arg2 = PG_GETARG_INT64(1);
+
+ PG_RETURN_INT64(arg1 ^ arg2);
+}
+
+Datum
+int8not(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+
+ PG_RETURN_INT64(~arg1);
+}
+
+Datum
+int8shl(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT64(arg1 << arg2);
+}
+
+Datum
+int8shr(PG_FUNCTION_ARGS)
+{
+ int64 arg1 = PG_GETARG_INT64(0);
+ int32 arg2 = PG_GETARG_INT32(1);
+
+ PG_RETURN_INT64(arg1 >> arg2);
+}
/*----------------------------------------------------------
* Conversion operators.
Index: src/include/catalog/pg_operator.h
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/catalog/pg_operator.h,v
retrieving revision 1.82
diff -u -r1.82 pg_operator.h
--- src/include/catalog/pg_operator.h 2000/09/15 18:45:27 1.82
+++ src/include/catalog/pg_operator.h 2000/09/25 07:01:10
@@ -754,6 +754,27 @@
DATA(insert OID = 1872 ( "<=" PGUID 0 b t f 20 21 16 1867 1871 0 0 int82le scalarltsel scalarltjoinsel ));
DATA(insert OID = 1873 ( ">=" PGUID 0 b t f 20 21 16 1866 1870 0 0 int82ge scalargtsel scalargtjoinsel ));
+DATA(insert OID = 1874 ( "&" PGUID 0 b t f 21 21 21 1874 0 0 0 int2and - - ));
+DATA(insert OID = 1875 ( "|" PGUID 0 b t f 21 21 21 1875 0 0 0 int2or - - ));
+DATA(insert OID = 1876 ( "^" PGUID 0 b t f 21 21 21 1876 0 0 0 int2xor - - ));
+DATA(insert OID = 1877 ( "~" PGUID 0 l t f 0 21 21 0 0 0 0 int2not - - ));
+DATA(insert OID = 1878 ( "<<" PGUID 0 b t f 21 23 21 0 0 0 0 int2shl - - ));
+DATA(insert OID = 1879 ( ">>" PGUID 0 b t f 21 23 21 0 0 0 0 int2shr - - ));
+
+DATA(insert OID = 1880 ( "&" PGUID 0 b t f 23 23 23 1880 0 0 0 int4and - - ));
+DATA(insert OID = 1881 ( "|" PGUID 0 b t f 23 23 23 1881 0 0 0 int4or - - ));
+DATA(insert OID = 1882 ( "^" PGUID 0 b t f 23 23 23 1882 0 0 0 int4xor - - ));
+DATA(insert OID = 1883 ( "~" PGUID 0 l t f 0 23 23 0 0 0 0 int4not - - ));
+DATA(insert OID = 1884 ( "<<" PGUID 0 b t f 23 23 23 0 0 0 0 int4shl - - ));
+DATA(insert OID = 1885 ( ">>" PGUID 0 b t f 23 23 23 0 0 0 0 int4shr - - ));
+
+DATA(insert OID = 1886 ( "&" PGUID 0 b t f 20 20 20 1886 0 0 0 int8and - - ));
+DATA(insert OID = 1887 ( "|" PGUID 0 b t f 20 20 20 1887 0 0 0 int8or - - ));
+DATA(insert OID = 1888 ( "^" PGUID 0 b t f 20 20 20 1888 0 0 0 int8xor - - ));
+DATA(insert OID = 1889 ( "~" PGUID 0 l t f 0 20 20 0 0 0 0 int8not - - ));
+DATA(insert OID = 1890 ( "<<" PGUID 0 b t f 20 23 20 0 0 0 0 int8shl - - ));
+DATA(insert OID = 1891 ( ">>" PGUID 0 b t f 20 23 20 0 0 0 0 int8shr - - ));
+
/*
* function prototypes
*/
Index: src/include/catalog/pg_proc.h
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/catalog/pg_proc.h,v
retrieving revision 1.167
diff -u -r1.167 pg_proc.h
--- src/include/catalog/pg_proc.h 2000/09/19 18:18:01 1.167
+++ src/include/catalog/pg_proc.h 2000/09/25 07:01:17
@@ -2511,6 +2511,44 @@
DATA(insert OID = 1861 ( int82ge PGUID 12 f t t t 2 f 16 "20 21" 100 0 0 100 int82ge - ));
DESCR("greater-than-or-equal");
+DATA(insert OID = 1892 ( int2and PGUID 12 f t t t 2 f 21 "21 21" 100 0 0 100 int2and - ));
+DESCR("binary and");
+DATA(insert OID = 1893 ( int2or PGUID 12 f t t t 2 f 21 "21 21" 100 0 0 100 int2or - ));
+DESCR("binary or");
+DATA(insert OID = 1894 ( int2xor PGUID 12 f t t t 2 f 21 "21 21" 100 0 0 100 int2xor - ));
+DESCR("binary xor");
+DATA(insert OID = 1895 ( int2not PGUID 12 f t t t 1 f 21 "21" 100 0 0 100 int2not - ));
+DESCR("binary not");
+DATA(insert OID = 1896 ( int2shl PGUID 12 f t t t 2 f 21 "21 23" 100 0 0 100 int2shl - ));
+DESCR("binary shift left");
+DATA(insert OID = 1897 ( int2shr PGUID 12 f t t t 2 f 21 "21 23" 100 0 0 100 int2shr - ));
+DESCR("binary shift right");
+
+DATA(insert OID = 1898 ( int4and PGUID 12 f t t t 2 f 23 "23 23" 100 0 0 100 int4and - ));
+DESCR("binary and");
+DATA(insert OID = 1899 ( int4or PGUID 12 f t t t 2 f 23 "23 23" 100 0 0 100 int4or - ));
+DESCR("binary or");
+DATA(insert OID = 1900 ( int4xor PGUID 12 f t t t 2 f 23 "23 23" 100 0 0 100 int4xor - ));
+DESCR("binary xor");
+DATA(insert OID = 1901 ( int4not PGUID 12 f t t t 1 f 23 "23" 100 0 0 100 int4not - ));
+DESCR("binary not");
+DATA(insert OID = 1902 ( int4shl PGUID 12 f t t t 2 f 23 "23 23" 100 0 0 100 int4shl - ));
+DESCR("binary shift left");
+DATA(insert OID = 1903 ( int4shr PGUID 12 f t t t 2 f 23 "23 23" 100 0 0 100 int4shr - ));
+DESCR("binary shift right");
+
+DATA(insert OID = 1904 ( int8and PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100 int8and - ));
+DESCR("binary and");
+DATA(insert OID = 1905 ( int8or PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100 int8or - ));
+DESCR("binary or");
+DATA(insert OID = 1906 ( int8xor PGUID 12 f t t t 2 f 20 "20 20" 100 0 0 100 int8xor - ));
+DESCR("binary xor");
+DATA(insert OID = 1907 ( int8not PGUID 12 f t t t 1 f 20 "20" 100 0 0 100 int8not - ));
+DESCR("binary not");
+DATA(insert OID = 1908 ( int8shl PGUID 12 f t t t 2 f 20 "20 23" 100 0 0 100 int8shl - ));
+DESCR("binary shift left");
+DATA(insert OID = 1909 ( int8shr PGUID 12 f t t t 2 f 20 "20 23" 100 0 0 100 int8shr - ));
+DESCR("binary shift right");
/*
* prototypes for functions pg_proc.c
Index: src/include/utils/builtins.h
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/utils/builtins.h,v
retrieving revision 1.138
diff -u -r1.138 builtins.h
--- src/include/utils/builtins.h 2000/09/19 18:18:02 1.138
+++ src/include/utils/builtins.h 2000/09/25 07:01:19
@@ -127,6 +127,19 @@
extern Datum int4larger(PG_FUNCTION_ARGS);
extern Datum int4smaller(PG_FUNCTION_ARGS);
+extern Datum int4and(PG_FUNCTION_ARGS);
+extern Datum int4or(PG_FUNCTION_ARGS);
+extern Datum int4xor(PG_FUNCTION_ARGS);
+extern Datum int4not(PG_FUNCTION_ARGS);
+extern Datum int4shl(PG_FUNCTION_ARGS);
+extern Datum int4shr(PG_FUNCTION_ARGS);
+extern Datum int2and(PG_FUNCTION_ARGS);
+extern Datum int2or(PG_FUNCTION_ARGS);
+extern Datum int2xor(PG_FUNCTION_ARGS);
+extern Datum int2not(PG_FUNCTION_ARGS);
+extern Datum int2shl(PG_FUNCTION_ARGS);
+extern Datum int2shr(PG_FUNCTION_ARGS);
+
/* name.c */
extern Datum namein(PG_FUNCTION_ARGS);
extern Datum nameout(PG_FUNCTION_ARGS);
Index: src/include/utils/int8.h
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/utils/int8.h,v
retrieving revision 1.23
diff -u -r1.23 int8.h
--- src/include/utils/int8.h 2000/07/28 05:07:44 1.23
+++ src/include/utils/int8.h 2000/09/25 07:01:19
@@ -76,6 +76,13 @@
extern Datum int8larger(PG_FUNCTION_ARGS);
extern Datum int8smaller(PG_FUNCTION_ARGS);
+extern Datum int8and(PG_FUNCTION_ARGS);
+extern Datum int8or(PG_FUNCTION_ARGS);
+extern Datum int8xor(PG_FUNCTION_ARGS);
+extern Datum int8not(PG_FUNCTION_ARGS);
+extern Datum int8shl(PG_FUNCTION_ARGS);
+extern Datum int8shr(PG_FUNCTION_ARGS);
+
extern Datum int84pl(PG_FUNCTION_ARGS);
extern Datum int84mi(PG_FUNCTION_ARGS);
extern Datum int84mul(PG_FUNCTION_ARGS);